@@ -5,7 +5,36 @@ All notable changes to this project will be documented in this file.
55The format is based on [ Keep a Changelog] ( https://keepachangelog.com/en/1.0.0/ ) , and this project
66adheres to [ Semantic Versioning] ( https://semver.org/spec/v2.0.0.html ) .
77
8- ## Unreleased
8+ ## v1.5.0
9+
10+ BREAKING CHANGES (type-level only — no runtime impact for typical users)
11+
12+ These changes do not alter runtime behavior for clients or activity/orchestrator
13+ authors, but because the package ships ` py.typed ` , consumers running strict type
14+ checkers (pyright/mypy) against their own code — or subclassing the public
15+ abstract types — may see new type-check errors and need to update their
16+ overrides:
17+
18+ - ` OrchestrationContext.create_timer ` now returns the specific ` TimerTask ` type
19+ (was ` CancellableTask ` )
20+ ([ #93 ] ( https://github.com/microsoft/durabletask-python/issues/93 ) ).
21+ - ` OrchestrationContext.wait_for_external_event ` now returns ` CancellableTask[Any] `
22+ (was a bare ` CancellableTask ` ).
23+ - ` WhenAnyTask ` is now generic; ` when_any(tasks: Sequence[Task[T]]) ` returns
24+ ` WhenAnyTask[T] ` for better static inference of the completing child task
25+ ([ #94 ] ( https://github.com/microsoft/durabletask-python/issues/94 ) ).
26+ ` CompositeTask.on_child_completed ` now takes ` Task[Any] ` .
27+ - ` TaskHubGrpcWorker.add_activity ` / ` add_entity ` (and the internal registry
28+ methods) now require ` Activity[Any, Any] ` / ` Entity[Any, Any] ` instead of the
29+ bare ` Activity ` / ` Entity ` aliases.
30+ - ` OrchestrationContext.call_entity ` / ` signal_entity ` ` input ` parameter widened
31+ from ` TInput | None ` to ` Any ` (Liskov-safe for callers; subclass overrides
32+ using the old narrower type will be flagged).
33+ - gRPC client interceptors now use the public ` grpc.ClientCallDetails ` /
34+ ` grpc.aio.ClientCallDetails ` types instead of private internal namedtuples;
35+ custom interceptor subclasses should retype their override parameters.
36+ - These changes also broadly improve generic type-safety hints throughout the
37+ SDK ([ #92 ] ( https://github.com/microsoft/durabletask-python/issues/92 ) ).
938
1039ADDED
1140
1443 existing ` AsyncTaskHubGrpcClient ` async-context-manager support and the
1544 ` TaskHubGrpcWorker ` pattern. ` DurableTaskSchedulerClient ` inherits this
1645 behavior automatically. ` __exit__ ` delegates to ` close() ` , so the
17- resiliency-aware teardown introduced in v1.5.0 (in-flight recreate
18- thread join, retired-channel timer cancellation, and SDK-owned channel
19- cleanup) runs unchanged through the new ` with ` path.
20- - Added a pyright type-check CI workflow that runs on pull requests and pushes
21- to ` main ` , using strict mode against the lowest supported Python version
22- (3.10) across both ` durabletask ` and ` durabletask-azuremanaged ` packages.
23- - Improved type coverage across the public API. ` OrchestrationContext.create_timer `
24- now returns the specific ` TimerTask ` type (previously ` CancellableTask ` )
25- ([ #93 ] ( https://github.com/microsoft/durabletask-python/issues/93 ) ), and
26- ` WhenAnyTask ` is now generic with ` when_any(tasks: Sequence[Task[T]]) -> WhenAnyTask[T] `
27- for better static type inference of the completing child task
28- ([ #94 ] ( https://github.com/microsoft/durabletask-python/issues/94 ) ).
29- These changes also broadly improve generic type-safety hints throughout the
30- SDK ([ #92 ] ( https://github.com/microsoft/durabletask-python/issues/92 ) ).
31-
32- ## v1.5.0
33-
34- ADDED
35-
46+ resiliency-aware teardown (in-flight recreate thread join, retired-channel
47+ timer cancellation, and SDK-owned channel cleanup) runs unchanged through the
48+ new ` with ` path.
3649- Added ` ReplaySafeLogger ` and ` OrchestrationContext.create_replay_safe_logger() `
3750 for suppressing duplicate log messages during orchestrator replay
3851- Added ` GrpcChannelOptions ` and ` GrpcRetryPolicyOptions ` for configuring
5366 ` ListInstanceIds ` so local orchestration tests can retrieve history and page
5467 terminal instance IDs by completion window.
5568
69+ CHANGED
70+
71+ - ` when_any ` now copies its input into a new list (` WhenAnyTask(list(tasks)) ` ).
72+ Previously the task aliased the caller's list, so mutating it after
73+ construction was visible inside the task; that side effect no longer occurs.
74+
5675FIXED
5776
77+ - Fixed ` EntityInstanceId.__lt__ ` infinite recursion when compared against a
78+ non-` EntityInstanceId ` operand. It now returns ` NotImplemented ` , so mixed-type
79+ comparisons raise ` TypeError ` cleanly instead of recursing.
5880- Improved ` TaskHubGrpcWorker ` recovery from stale or disconnected gRPC streams
5981 so configured hello timeouts apply on fresh connections, received work resets
6082 failure tracking, SDK-owned channels are refreshed and cleaned up safely, and
0 commit comments