1use crate::policy::ExecutionPolicy;
7use crate::state::{AttemptType, PublicState, StateVector};
8use crate::types::{
9 AttemptId, AttemptIndex, CancelSource, ExecutionId, LaneId, LeaseEpoch, LeaseId, Namespace,
10 SignalId, SuspensionId, TimestampMs, WaitpointId, WaitpointToken, WorkerId, WorkerInstanceId,
11};
12use serde::{Deserialize, Serialize};
13use std::collections::{BTreeSet, HashMap};
14
15#[derive(Clone, Debug, Serialize, Deserialize)]
18pub struct CreateExecutionArgs {
19 pub execution_id: ExecutionId,
20 pub namespace: Namespace,
21 pub lane_id: LaneId,
22 pub execution_kind: String,
23 pub input_payload: Vec<u8>,
24 #[serde(default)]
25 pub payload_encoding: Option<String>,
26 pub priority: i32,
27 pub creator_identity: String,
28 #[serde(default)]
29 pub idempotency_key: Option<String>,
30 #[serde(default)]
31 pub tags: HashMap<String, String>,
32 #[serde(default)]
34 pub policy: Option<ExecutionPolicy>,
35 #[serde(default)]
37 pub delay_until: Option<TimestampMs>,
38 #[serde(default)]
40 pub execution_deadline_at: Option<TimestampMs>,
41 pub partition_id: u16,
43 pub now: TimestampMs,
44}
45
46#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
47pub enum CreateExecutionResult {
48 Created {
50 execution_id: ExecutionId,
51 public_state: PublicState,
52 },
53 Duplicate { execution_id: ExecutionId },
55}
56
57#[derive(Clone, Debug, Serialize, Deserialize)]
60pub struct IssueClaimGrantArgs {
61 pub execution_id: ExecutionId,
62 pub lane_id: LaneId,
63 pub worker_id: WorkerId,
64 pub worker_instance_id: WorkerInstanceId,
65 #[serde(default)]
66 pub capability_hash: Option<String>,
67 #[serde(default)]
68 pub route_snapshot_json: Option<String>,
69 #[serde(default)]
70 pub admission_summary: Option<String>,
71 #[serde(default)]
76 pub worker_capabilities: BTreeSet<String>,
77 pub grant_ttl_ms: u64,
78 pub now: TimestampMs,
81}
82
83#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
84pub enum IssueClaimGrantResult {
85 Granted { execution_id: ExecutionId },
87}
88
89#[derive(Clone, Debug, PartialEq, Eq)]
107pub struct ClaimGrant {
108 pub execution_id: ExecutionId,
110 pub partition: crate::partition::Partition,
112 pub grant_key: String,
115 pub expires_at_ms: u64,
117}
118
119#[derive(Clone, Debug, PartialEq, Eq)]
160pub struct ReclaimGrant {
161 pub execution_id: ExecutionId,
163 pub partition: crate::partition::Partition,
165 pub grant_key: String,
168 pub expires_at_ms: u64,
171 pub lane_id: LaneId,
175}
176
177#[derive(Clone, Debug, Serialize, Deserialize)]
180pub struct ClaimExecutionArgs {
181 pub execution_id: ExecutionId,
182 pub worker_id: WorkerId,
183 pub worker_instance_id: WorkerInstanceId,
184 pub lane_id: LaneId,
185 pub lease_id: LeaseId,
186 pub lease_ttl_ms: u64,
187 pub attempt_id: AttemptId,
188 pub expected_attempt_index: AttemptIndex,
191 #[serde(default)]
193 pub attempt_policy_json: String,
194 #[serde(default)]
196 pub attempt_timeout_ms: Option<u64>,
197 #[serde(default)]
199 pub execution_deadline_at: Option<i64>,
200 pub now: TimestampMs,
201}
202
203#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
204pub struct ClaimedExecution {
205 pub execution_id: ExecutionId,
206 pub lease_id: LeaseId,
207 pub lease_epoch: LeaseEpoch,
208 pub attempt_index: AttemptIndex,
209 pub attempt_id: AttemptId,
210 pub attempt_type: AttemptType,
211 pub lease_expires_at: TimestampMs,
212}
213
214#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
215pub enum ClaimExecutionResult {
216 Claimed(ClaimedExecution),
218}
219
220#[derive(Clone, Debug, Serialize, Deserialize)]
223pub struct CompleteExecutionArgs {
224 pub execution_id: ExecutionId,
225 pub lease_id: LeaseId,
226 pub lease_epoch: LeaseEpoch,
227 pub attempt_index: AttemptIndex,
228 pub attempt_id: AttemptId,
229 #[serde(default)]
230 pub result_payload: Option<Vec<u8>>,
231 #[serde(default)]
232 pub result_encoding: Option<String>,
233 pub now: TimestampMs,
234}
235
236#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
237pub enum CompleteExecutionResult {
238 Completed {
240 execution_id: ExecutionId,
241 public_state: PublicState,
242 },
243}
244
245#[derive(Clone, Debug, Serialize, Deserialize)]
248pub struct RenewLeaseArgs {
249 pub execution_id: ExecutionId,
250 pub attempt_index: AttemptIndex,
251 pub attempt_id: AttemptId,
252 pub lease_id: LeaseId,
253 pub lease_epoch: LeaseEpoch,
254 pub lease_ttl_ms: u64,
256 #[serde(default = "default_lease_history_grace_ms")]
258 pub lease_history_grace_ms: u64,
259}
260
261fn default_lease_history_grace_ms() -> u64 {
262 60_000
263}
264
265#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
266pub enum RenewLeaseResult {
267 Renewed { expires_at: TimestampMs },
269}
270
271#[derive(Clone, Debug, Serialize, Deserialize)]
274pub struct MarkLeaseExpiredArgs {
275 pub execution_id: ExecutionId,
276}
277
278#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
279pub enum MarkLeaseExpiredResult {
280 MarkedExpired,
282 AlreadySatisfied { reason: String },
284}
285
286#[derive(Clone, Debug, Serialize, Deserialize)]
289pub struct CancelExecutionArgs {
290 pub execution_id: ExecutionId,
291 pub reason: String,
292 #[serde(default)]
293 pub source: CancelSource,
294 #[serde(default)]
296 pub lease_id: Option<LeaseId>,
297 #[serde(default)]
298 pub lease_epoch: Option<LeaseEpoch>,
299 #[serde(default)]
301 pub attempt_id: Option<AttemptId>,
302 pub now: TimestampMs,
303}
304
305#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
306pub enum CancelExecutionResult {
307 Cancelled {
309 execution_id: ExecutionId,
310 public_state: PublicState,
311 },
312}
313
314#[derive(Clone, Debug, Serialize, Deserialize)]
317pub struct RevokeLeaseArgs {
318 pub execution_id: ExecutionId,
319 #[serde(default)]
321 pub expected_lease_id: Option<String>,
322 pub worker_instance_id: WorkerInstanceId,
324 pub reason: String,
325}
326
327#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
328pub enum RevokeLeaseResult {
329 Revoked { lease_id: String, lease_epoch: String },
331 AlreadySatisfied { reason: String },
333}
334
335#[derive(Clone, Debug, Serialize, Deserialize)]
338pub struct DelayExecutionArgs {
339 pub execution_id: ExecutionId,
340 pub lease_id: LeaseId,
341 pub lease_epoch: LeaseEpoch,
342 pub attempt_index: AttemptIndex,
343 pub attempt_id: AttemptId,
344 pub delay_until: TimestampMs,
345 pub now: TimestampMs,
346}
347
348#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
349pub enum DelayExecutionResult {
350 Delayed {
352 execution_id: ExecutionId,
353 public_state: PublicState,
354 },
355}
356
357#[derive(Clone, Debug, Serialize, Deserialize)]
360pub struct MoveToWaitingChildrenArgs {
361 pub execution_id: ExecutionId,
362 pub lease_id: LeaseId,
363 pub lease_epoch: LeaseEpoch,
364 pub attempt_index: AttemptIndex,
365 pub attempt_id: AttemptId,
366 pub now: TimestampMs,
367}
368
369#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
370pub enum MoveToWaitingChildrenResult {
371 Moved {
373 execution_id: ExecutionId,
374 public_state: PublicState,
375 },
376}
377
378#[derive(Clone, Debug, Serialize, Deserialize)]
381pub struct ChangePriorityArgs {
382 pub execution_id: ExecutionId,
383 pub new_priority: i32,
384 pub lane_id: LaneId,
385 pub now: TimestampMs,
386}
387
388#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
389pub enum ChangePriorityResult {
390 Changed { execution_id: ExecutionId },
392}
393
394#[derive(Clone, Debug, Serialize, Deserialize)]
397pub struct UpdateProgressArgs {
398 pub execution_id: ExecutionId,
399 pub lease_id: LeaseId,
400 pub lease_epoch: LeaseEpoch,
401 pub attempt_id: AttemptId,
402 #[serde(default)]
403 pub progress_pct: Option<u8>,
404 #[serde(default)]
405 pub progress_message: Option<String>,
406 pub now: TimestampMs,
407}
408
409#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
410pub enum UpdateProgressResult {
411 Updated,
413}
414
415#[derive(Clone, Debug, Serialize, Deserialize)]
422pub struct FailExecutionArgs {
423 pub execution_id: ExecutionId,
424 pub lease_id: LeaseId,
425 pub lease_epoch: LeaseEpoch,
426 pub attempt_index: AttemptIndex,
427 pub attempt_id: AttemptId,
428 pub failure_reason: String,
429 pub failure_category: String,
430 #[serde(default)]
432 pub retry_policy_json: String,
433 #[serde(default)]
435 pub next_attempt_policy_json: String,
436}
437
438#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
440pub enum FailExecutionResult {
441 RetryScheduled {
443 delay_until: TimestampMs,
444 next_attempt_index: AttemptIndex,
445 },
446 TerminalFailed,
448}
449
450#[derive(Clone, Debug, Serialize, Deserialize)]
453pub struct IssueReclaimGrantArgs {
454 pub execution_id: ExecutionId,
455 pub worker_id: WorkerId,
456 pub worker_instance_id: WorkerInstanceId,
457 pub lane_id: LaneId,
458 #[serde(default)]
459 pub capability_hash: Option<String>,
460 pub grant_ttl_ms: u64,
461 #[serde(default)]
462 pub route_snapshot_json: Option<String>,
463 #[serde(default)]
464 pub admission_summary: Option<String>,
465 pub now: TimestampMs,
470}
471
472#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
473pub enum IssueReclaimGrantResult {
474 Granted { expires_at_ms: TimestampMs },
476}
477
478#[derive(Clone, Debug, Serialize, Deserialize)]
481pub struct ReclaimExecutionArgs {
482 pub execution_id: ExecutionId,
483 pub worker_id: WorkerId,
484 pub worker_instance_id: WorkerInstanceId,
485 pub lane_id: LaneId,
486 #[serde(default)]
487 pub capability_hash: Option<String>,
488 pub lease_id: LeaseId,
489 pub lease_ttl_ms: u64,
490 pub attempt_id: AttemptId,
491 #[serde(default)]
493 pub attempt_policy_json: String,
494 #[serde(default = "default_max_reclaim_count")]
496 pub max_reclaim_count: u32,
497 pub old_worker_instance_id: WorkerInstanceId,
499 pub current_attempt_index: AttemptIndex,
501}
502
503fn default_max_reclaim_count() -> u32 {
504 100
505}
506
507#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
508pub enum ReclaimExecutionResult {
509 Reclaimed {
511 new_attempt_index: AttemptIndex,
512 new_attempt_id: AttemptId,
513 new_lease_id: LeaseId,
514 new_lease_epoch: LeaseEpoch,
515 lease_expires_at: TimestampMs,
516 },
517 MaxReclaimsExceeded,
519}
520
521#[derive(Clone, Debug, Serialize, Deserialize)]
524pub struct ExpireExecutionArgs {
525 pub execution_id: ExecutionId,
526 pub expire_reason: String,
528}
529
530#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
531pub enum ExpireExecutionResult {
532 Expired { execution_id: ExecutionId },
534 AlreadyTerminal,
536}
537
538#[derive(Clone, Debug, Serialize, Deserialize)]
545pub struct SuspendExecutionArgs {
546 pub execution_id: ExecutionId,
547 pub lease_id: LeaseId,
548 pub lease_epoch: LeaseEpoch,
549 pub attempt_index: AttemptIndex,
550 pub attempt_id: AttemptId,
551 pub suspension_id: SuspensionId,
552 pub waitpoint_id: WaitpointId,
553 pub waitpoint_key: String,
554 pub reason_code: String,
555 pub requested_by: String,
556 pub resume_condition_json: String,
557 pub resume_policy_json: String,
558 #[serde(default)]
559 pub continuation_metadata_pointer: Option<String>,
560 #[serde(default)]
561 pub timeout_at: Option<TimestampMs>,
562 #[serde(default)]
564 pub use_pending_waitpoint: bool,
565 #[serde(default = "default_timeout_behavior")]
567 pub timeout_behavior: String,
568}
569
570fn default_timeout_behavior() -> String {
571 "fail".to_owned()
572}
573
574#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
575pub enum SuspendExecutionResult {
576 Suspended {
578 suspension_id: SuspensionId,
579 waitpoint_id: WaitpointId,
580 waitpoint_key: String,
581 waitpoint_token: WaitpointToken,
585 },
586 AlreadySatisfied {
589 suspension_id: SuspensionId,
590 waitpoint_id: WaitpointId,
591 waitpoint_key: String,
592 waitpoint_token: WaitpointToken,
593 },
594}
595
596#[derive(Clone, Debug, Serialize, Deserialize)]
599pub struct ResumeExecutionArgs {
600 pub execution_id: ExecutionId,
601 #[serde(default = "default_trigger_type")]
603 pub trigger_type: String,
604 #[serde(default)]
606 pub resume_delay_ms: u64,
607}
608
609fn default_trigger_type() -> String {
610 "signal".to_owned()
611}
612
613#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
614pub enum ResumeExecutionResult {
615 Resumed { public_state: PublicState },
617}
618
619#[derive(Clone, Debug, Serialize, Deserialize)]
622pub struct CreatePendingWaitpointArgs {
623 pub execution_id: ExecutionId,
624 pub lease_id: LeaseId,
625 pub lease_epoch: LeaseEpoch,
626 pub attempt_index: AttemptIndex,
627 pub attempt_id: AttemptId,
628 pub waitpoint_id: WaitpointId,
629 pub waitpoint_key: String,
630 pub expires_in_ms: u64,
632}
633
634#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
635pub enum CreatePendingWaitpointResult {
636 Created {
638 waitpoint_id: WaitpointId,
639 waitpoint_key: String,
640 waitpoint_token: WaitpointToken,
644 },
645}
646
647#[derive(Clone, Debug, Serialize, Deserialize)]
650pub struct CloseWaitpointArgs {
651 pub waitpoint_id: WaitpointId,
652 pub reason: String,
653}
654
655#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
656pub enum CloseWaitpointResult {
657 Closed,
659}
660
661#[derive(Clone, Debug, Serialize, Deserialize)]
664pub struct DeliverSignalArgs {
665 pub execution_id: ExecutionId,
666 pub waitpoint_id: WaitpointId,
667 pub signal_id: SignalId,
668 pub signal_name: String,
669 pub signal_category: String,
670 pub source_type: String,
671 pub source_identity: String,
672 #[serde(default)]
673 pub payload: Option<Vec<u8>>,
674 #[serde(default)]
675 pub payload_encoding: Option<String>,
676 #[serde(default)]
677 pub correlation_id: Option<String>,
678 #[serde(default)]
679 pub idempotency_key: Option<String>,
680 pub target_scope: String,
681 #[serde(default)]
682 pub created_at: Option<TimestampMs>,
683 #[serde(default)]
685 pub dedup_ttl_ms: Option<u64>,
686 #[serde(default)]
688 pub resume_delay_ms: Option<u64>,
689 #[serde(default)]
691 pub max_signals_per_execution: Option<u64>,
692 #[serde(default)]
694 pub signal_maxlen: Option<u64>,
695 pub waitpoint_token: WaitpointToken,
706 pub now: TimestampMs,
707}
708
709#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
710pub enum DeliverSignalResult {
711 Accepted {
713 signal_id: SignalId,
714 effect: String,
715 },
716 Duplicate { existing_signal_id: SignalId },
718}
719
720#[derive(Clone, Debug, Serialize, Deserialize)]
723pub struct BufferSignalArgs {
724 pub execution_id: ExecutionId,
725 pub waitpoint_id: WaitpointId,
726 pub signal_id: SignalId,
727 pub signal_name: String,
728 pub signal_category: String,
729 pub source_type: String,
730 pub source_identity: String,
731 #[serde(default)]
732 pub payload: Option<Vec<u8>>,
733 #[serde(default)]
734 pub payload_encoding: Option<String>,
735 #[serde(default)]
736 pub idempotency_key: Option<String>,
737 pub target_scope: String,
738 pub waitpoint_token: WaitpointToken,
741 pub now: TimestampMs,
742}
743
744#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
745pub enum BufferSignalResult {
746 Buffered { signal_id: SignalId },
748 Duplicate { existing_signal_id: SignalId },
750}
751
752#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
768pub struct PendingWaitpointInfo {
769 pub waitpoint_id: WaitpointId,
770 pub waitpoint_key: String,
771 pub state: String,
774 pub waitpoint_token: WaitpointToken,
777 #[serde(default)]
787 pub required_signal_names: Vec<String>,
788 pub created_at: TimestampMs,
790 #[serde(default, skip_serializing_if = "Option::is_none")]
793 pub activated_at: Option<TimestampMs>,
794 #[serde(default, skip_serializing_if = "Option::is_none")]
796 pub expires_at: Option<TimestampMs>,
797}
798
799#[derive(Clone, Debug, Serialize, Deserialize)]
802pub struct ExpireSuspensionArgs {
803 pub execution_id: ExecutionId,
804}
805
806#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
807pub enum ExpireSuspensionResult {
808 Expired { behavior_applied: String },
810 AlreadySatisfied { reason: String },
812}
813
814#[derive(Clone, Debug, Serialize, Deserialize)]
817pub struct ClaimResumedExecutionArgs {
818 pub execution_id: ExecutionId,
819 pub worker_id: WorkerId,
820 pub worker_instance_id: WorkerInstanceId,
821 pub lane_id: LaneId,
822 pub lease_id: LeaseId,
823 pub lease_ttl_ms: u64,
824 pub current_attempt_index: AttemptIndex,
826 #[serde(default)]
828 pub remaining_attempt_timeout_ms: Option<u64>,
829 pub now: TimestampMs,
830}
831
832#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
833pub struct ClaimedResumedExecution {
834 pub execution_id: ExecutionId,
835 pub lease_id: LeaseId,
836 pub lease_epoch: LeaseEpoch,
837 pub attempt_index: AttemptIndex,
838 pub attempt_id: AttemptId,
839 pub lease_expires_at: TimestampMs,
840}
841
842#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
843pub enum ClaimResumedExecutionResult {
844 Claimed(ClaimedResumedExecution),
846}
847
848#[derive(Clone, Debug, Serialize, Deserialize)]
855pub struct AppendFrameArgs {
856 pub execution_id: ExecutionId,
857 pub attempt_index: AttemptIndex,
858 pub lease_id: LeaseId,
859 pub lease_epoch: LeaseEpoch,
860 pub attempt_id: AttemptId,
861 pub frame_type: String,
862 pub timestamp: TimestampMs,
863 pub payload: Vec<u8>,
864 #[serde(default)]
865 pub encoding: Option<String>,
866 #[serde(default)]
868 pub metadata_json: Option<String>,
869 #[serde(default)]
870 pub correlation_id: Option<String>,
871 #[serde(default)]
872 pub source: Option<String>,
873 #[serde(default)]
875 pub retention_maxlen: Option<u32>,
876 #[serde(default)]
878 pub max_payload_bytes: Option<u32>,
879}
880
881#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
882pub enum AppendFrameResult {
883 Appended {
885 entry_id: String,
887 frame_count: u64,
889 },
890}
891
892pub const STREAM_READ_HARD_CAP: u64 = 10_000;
901
902#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
908pub struct StreamFrame {
909 pub id: String,
911 pub fields: std::collections::BTreeMap<String, String>,
913}
914
915#[derive(Clone, Debug, Serialize, Deserialize)]
917pub struct ReadFramesArgs {
918 pub execution_id: ExecutionId,
919 pub attempt_index: AttemptIndex,
920 pub from_id: String,
922 pub to_id: String,
924 pub count_limit: u64,
928}
929
930#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
933pub struct StreamFrames {
934 pub frames: Vec<StreamFrame>,
936 #[serde(default, skip_serializing_if = "Option::is_none")]
939 pub closed_at: Option<TimestampMs>,
940 #[serde(default, skip_serializing_if = "Option::is_none")]
944 pub closed_reason: Option<String>,
945}
946
947impl StreamFrames {
948 pub fn empty_open() -> Self {
951 Self { frames: Vec::new(), closed_at: None, closed_reason: None }
952 }
953
954 pub fn is_closed(&self) -> bool {
957 self.closed_at.is_some()
958 }
959}
960
961#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
962pub enum ReadFramesResult {
963 Frames(StreamFrames),
965}
966
967#[derive(Clone, Debug, Serialize, Deserialize)]
974pub struct CreateBudgetArgs {
975 pub budget_id: crate::types::BudgetId,
976 pub scope_type: String,
977 pub scope_id: String,
978 pub enforcement_mode: String,
979 pub on_hard_limit: String,
980 pub on_soft_limit: String,
981 pub reset_interval_ms: u64,
982 pub dimensions: Vec<String>,
984 pub hard_limits: Vec<u64>,
986 pub soft_limits: Vec<u64>,
988 pub now: TimestampMs,
989}
990
991#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
992pub enum CreateBudgetResult {
993 Created { budget_id: crate::types::BudgetId },
995 AlreadySatisfied { budget_id: crate::types::BudgetId },
997}
998
999#[derive(Clone, Debug, Serialize, Deserialize)]
1002pub struct CreateQuotaPolicyArgs {
1003 pub quota_policy_id: crate::types::QuotaPolicyId,
1004 pub window_seconds: u64,
1005 pub max_requests_per_window: u64,
1006 pub max_concurrent: u64,
1007 pub now: TimestampMs,
1008}
1009
1010#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1011pub enum CreateQuotaPolicyResult {
1012 Created { quota_policy_id: crate::types::QuotaPolicyId },
1014 AlreadySatisfied { quota_policy_id: crate::types::QuotaPolicyId },
1016}
1017
1018#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1022pub struct BudgetStatus {
1023 pub budget_id: String,
1024 pub scope_type: String,
1025 pub scope_id: String,
1026 pub enforcement_mode: String,
1027 pub usage: HashMap<String, u64>,
1029 pub hard_limits: HashMap<String, u64>,
1031 pub soft_limits: HashMap<String, u64>,
1033 pub breach_count: u64,
1034 pub soft_breach_count: u64,
1035 pub last_breach_at: Option<String>,
1036 pub last_breach_dim: Option<String>,
1037 pub next_reset_at: Option<String>,
1038 pub created_at: Option<String>,
1039}
1040
1041#[derive(Clone, Debug, Serialize, Deserialize)]
1044pub struct ReportUsageArgs {
1045 pub dimensions: Vec<String>,
1047 pub deltas: Vec<u64>,
1049 pub now: TimestampMs,
1050 #[serde(default)]
1053 pub dedup_key: Option<String>,
1054}
1055
1056#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1057pub enum ReportUsageResult {
1058 Ok,
1060 SoftBreach {
1062 dimension: String,
1063 current_usage: u64,
1064 soft_limit: u64,
1065 },
1066 HardBreach {
1068 dimension: String,
1069 current_usage: u64,
1070 hard_limit: u64,
1071 },
1072 AlreadyApplied,
1074}
1075
1076#[derive(Clone, Debug, Serialize, Deserialize)]
1079pub struct ResetBudgetArgs {
1080 pub budget_id: crate::types::BudgetId,
1081 pub now: TimestampMs,
1082}
1083
1084#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1085pub enum ResetBudgetResult {
1086 Reset { next_reset_at: TimestampMs },
1088}
1089
1090#[derive(Clone, Debug, Serialize, Deserialize)]
1093pub struct CheckAdmissionArgs {
1094 pub execution_id: ExecutionId,
1095 pub now: TimestampMs,
1096 pub window_seconds: u64,
1097 pub rate_limit: u64,
1098 pub concurrency_cap: u64,
1099 #[serde(default)]
1100 pub jitter_ms: Option<u64>,
1101}
1102
1103#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1104pub enum CheckAdmissionResult {
1105 Admitted,
1107 AlreadyAdmitted,
1109 RateExceeded { retry_after_ms: u64 },
1111 ConcurrencyExceeded,
1113}
1114
1115#[derive(Clone, Debug, Serialize, Deserialize)]
1118pub struct ReleaseAdmissionArgs {
1119 pub execution_id: ExecutionId,
1120}
1121
1122#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1123pub enum ReleaseAdmissionResult {
1124 Released,
1125}
1126
1127#[derive(Clone, Debug, Serialize, Deserialize)]
1130pub struct BlockExecutionArgs {
1131 pub execution_id: ExecutionId,
1132 pub blocking_reason: String,
1133 #[serde(default)]
1134 pub blocking_detail: Option<String>,
1135 pub now: TimestampMs,
1136}
1137
1138#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1139pub enum BlockExecutionResult {
1140 Blocked,
1142}
1143
1144#[derive(Clone, Debug, Serialize, Deserialize)]
1147pub struct UnblockExecutionArgs {
1148 pub execution_id: ExecutionId,
1149 pub now: TimestampMs,
1150 #[serde(default)]
1152 pub expected_blocking_reason: Option<String>,
1153}
1154
1155#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1156pub enum UnblockExecutionResult {
1157 Unblocked,
1159}
1160
1161#[derive(Clone, Debug, Serialize, Deserialize)]
1168pub struct CreateFlowArgs {
1169 pub flow_id: crate::types::FlowId,
1170 pub flow_kind: String,
1171 pub namespace: Namespace,
1172 pub now: TimestampMs,
1173}
1174
1175#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1176pub enum CreateFlowResult {
1177 Created { flow_id: crate::types::FlowId },
1179 AlreadySatisfied { flow_id: crate::types::FlowId },
1181}
1182
1183#[derive(Clone, Debug, Serialize, Deserialize)]
1186pub struct AddExecutionToFlowArgs {
1187 pub flow_id: crate::types::FlowId,
1188 pub execution_id: ExecutionId,
1189 pub now: TimestampMs,
1190}
1191
1192#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1193pub enum AddExecutionToFlowResult {
1194 Added {
1196 execution_id: ExecutionId,
1197 new_node_count: u32,
1198 },
1199 AlreadyMember {
1201 execution_id: ExecutionId,
1202 node_count: u32,
1203 },
1204}
1205
1206#[derive(Clone, Debug, Serialize, Deserialize)]
1209pub struct CancelFlowArgs {
1210 pub flow_id: crate::types::FlowId,
1211 pub reason: String,
1212 pub cancellation_policy: String,
1213 pub now: TimestampMs,
1214}
1215
1216#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1217pub enum CancelFlowResult {
1218 Cancelled {
1230 cancellation_policy: String,
1231 member_execution_ids: Vec<String>,
1232 },
1233 CancellationScheduled {
1238 cancellation_policy: String,
1239 member_count: u32,
1240 member_execution_ids: Vec<String>,
1241 },
1242}
1243
1244#[derive(Clone, Debug, Serialize, Deserialize)]
1247pub struct StageDependencyEdgeArgs {
1248 pub flow_id: crate::types::FlowId,
1249 pub edge_id: crate::types::EdgeId,
1250 pub upstream_execution_id: ExecutionId,
1251 pub downstream_execution_id: ExecutionId,
1252 #[serde(default = "default_dependency_kind")]
1253 pub dependency_kind: String,
1254 #[serde(default)]
1255 pub data_passing_ref: Option<String>,
1256 pub expected_graph_revision: u64,
1257 pub now: TimestampMs,
1258}
1259
1260fn default_dependency_kind() -> String {
1261 "success_only".to_owned()
1262}
1263
1264#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1265pub enum StageDependencyEdgeResult {
1266 Staged {
1268 edge_id: crate::types::EdgeId,
1269 new_graph_revision: u64,
1270 },
1271}
1272
1273#[derive(Clone, Debug, Serialize, Deserialize)]
1276pub struct ApplyDependencyToChildArgs {
1277 pub flow_id: crate::types::FlowId,
1278 pub edge_id: crate::types::EdgeId,
1279 pub downstream_execution_id: ExecutionId,
1281 pub upstream_execution_id: ExecutionId,
1282 pub graph_revision: u64,
1283 #[serde(default = "default_dependency_kind")]
1284 pub dependency_kind: String,
1285 #[serde(default)]
1286 pub data_passing_ref: Option<String>,
1287 pub now: TimestampMs,
1288}
1289
1290#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1291pub enum ApplyDependencyToChildResult {
1292 Applied { unsatisfied_count: u32 },
1294 AlreadyApplied,
1296}
1297
1298#[derive(Clone, Debug, Serialize, Deserialize)]
1301pub struct ResolveDependencyArgs {
1302 pub edge_id: crate::types::EdgeId,
1303 pub upstream_outcome: String,
1305 pub now: TimestampMs,
1306}
1307
1308#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1309pub enum ResolveDependencyResult {
1310 Satisfied,
1312 Impossible,
1314 AlreadyResolved,
1316}
1317
1318#[derive(Clone, Debug, Serialize, Deserialize)]
1321pub struct PromoteBlockedToEligibleArgs {
1322 pub execution_id: ExecutionId,
1323 pub now: TimestampMs,
1324}
1325
1326#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1327pub enum PromoteBlockedToEligibleResult {
1328 Promoted,
1329}
1330
1331#[derive(Clone, Debug, Serialize, Deserialize)]
1334pub struct EvaluateFlowEligibilityArgs {
1335 pub execution_id: ExecutionId,
1336}
1337
1338#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1339pub enum EvaluateFlowEligibilityResult {
1340 Status { status: String },
1342}
1343
1344#[derive(Clone, Debug, Serialize, Deserialize)]
1347pub struct ReplayExecutionArgs {
1348 pub execution_id: ExecutionId,
1349 pub now: TimestampMs,
1350}
1351
1352#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1353pub enum ReplayExecutionResult {
1354 Replayed { public_state: PublicState },
1356}
1357
1358#[derive(Clone, Debug, Serialize, Deserialize)]
1362pub struct ExecutionInfo {
1363 pub execution_id: ExecutionId,
1364 pub namespace: String,
1365 pub lane_id: String,
1366 pub priority: i32,
1367 pub execution_kind: String,
1368 pub state_vector: StateVector,
1369 pub public_state: PublicState,
1370 pub created_at: String,
1371 #[serde(default, skip_serializing_if = "Option::is_none")]
1376 pub started_at: Option<String>,
1377 #[serde(default, skip_serializing_if = "Option::is_none")]
1381 pub completed_at: Option<String>,
1382 pub current_attempt_index: u32,
1383 pub flow_id: Option<String>,
1384 pub blocking_detail: String,
1385}
1386
1387#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
1391pub struct StateSummary {
1392 pub state_vector: StateVector,
1393 pub current_attempt_index: AttemptIndex,
1394}
1395
1396#[cfg(test)]
1397mod tests {
1398 use super::*;
1399 use crate::types::FlowId;
1400
1401 #[test]
1402 fn create_execution_args_serde() {
1403 let config = crate::partition::PartitionConfig::default();
1404 let args = CreateExecutionArgs {
1405 execution_id: ExecutionId::for_flow(&FlowId::new(), &config),
1406 namespace: Namespace::new("test"),
1407 lane_id: LaneId::new("default"),
1408 execution_kind: "llm_call".to_owned(),
1409 input_payload: b"hello".to_vec(),
1410 payload_encoding: Some("json".to_owned()),
1411 priority: 0,
1412 creator_identity: "test-user".to_owned(),
1413 idempotency_key: None,
1414 tags: HashMap::new(),
1415 policy: None,
1416 delay_until: None,
1417 execution_deadline_at: None,
1418 partition_id: 42,
1419 now: TimestampMs::now(),
1420 };
1421 let json = serde_json::to_string(&args).unwrap();
1422 let parsed: CreateExecutionArgs = serde_json::from_str(&json).unwrap();
1423 assert_eq!(args.execution_id, parsed.execution_id);
1424 }
1425
1426 #[test]
1427 fn claim_result_serde() {
1428 let config = crate::partition::PartitionConfig::default();
1429 let result = ClaimExecutionResult::Claimed(ClaimedExecution {
1430 execution_id: ExecutionId::for_flow(&FlowId::new(), &config),
1431 lease_id: LeaseId::new(),
1432 lease_epoch: LeaseEpoch::new(1),
1433 attempt_index: AttemptIndex::new(0),
1434 attempt_id: AttemptId::new(),
1435 attempt_type: AttemptType::Initial,
1436 lease_expires_at: TimestampMs::from_millis(1000),
1437 });
1438 let json = serde_json::to_string(&result).unwrap();
1439 let parsed: ClaimExecutionResult = serde_json::from_str(&json).unwrap();
1440 assert_eq!(result, parsed);
1441 }
1442}
1443
1444#[derive(Clone, Debug, Serialize, Deserialize)]
1448pub struct ExecutionSummary {
1449 pub execution_id: ExecutionId,
1450 pub namespace: String,
1451 pub lane_id: String,
1452 pub execution_kind: String,
1453 pub public_state: String,
1454 pub priority: i32,
1455 pub created_at: String,
1456}
1457
1458#[derive(Clone, Debug, Serialize, Deserialize)]
1460pub struct ListExecutionsResult {
1461 pub executions: Vec<ExecutionSummary>,
1462 pub total_returned: usize,
1463}
1464
1465#[derive(Clone, Debug)]
1477pub struct RotateWaitpointHmacSecretArgs {
1478 pub new_kid: String,
1479 pub new_secret_hex: String,
1480 pub grace_ms: u64,
1483}
1484
1485#[derive(Clone, Debug, PartialEq, Eq)]
1487pub enum RotateWaitpointHmacSecretOutcome {
1488 Rotated {
1492 previous_kid: Option<String>,
1493 new_kid: String,
1494 gc_count: u32,
1495 },
1496 Noop { kid: String },
1499}
1500
1501#[derive(Clone, Debug, PartialEq, Eq)]
1504pub struct ListWaitpointHmacKidsArgs {}
1505
1506#[derive(Clone, Debug, PartialEq, Eq)]
1508pub struct WaitpointHmacKids {
1509 pub current_kid: Option<String>,
1511 pub verifying: Vec<VerifyingKid>,
1515}
1516
1517#[derive(Clone, Debug, PartialEq, Eq)]
1518pub struct VerifyingKid {
1519 pub kid: String,
1520 pub expires_at_ms: i64,
1521}