use crate::policy::ExecutionPolicy;
use crate::state::{AttemptType, PublicState, StateVector};
use crate::types::{
AttemptId, AttemptIndex, CancelSource, ExecutionId, LaneId, LeaseEpoch, LeaseId, Namespace,
SignalId, SuspensionId, TimestampMs, WaitpointId, WaitpointToken, WorkerId, WorkerInstanceId,
};
use serde::{Deserialize, Serialize};
use std::collections::{BTreeSet, HashMap};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CreateExecutionArgs {
pub execution_id: ExecutionId,
pub namespace: Namespace,
pub lane_id: LaneId,
pub execution_kind: String,
pub input_payload: Vec<u8>,
#[serde(default)]
pub payload_encoding: Option<String>,
pub priority: i32,
pub creator_identity: String,
#[serde(default)]
pub idempotency_key: Option<String>,
#[serde(default)]
pub tags: HashMap<String, String>,
#[serde(default)]
pub policy: Option<ExecutionPolicy>,
#[serde(default)]
pub delay_until: Option<TimestampMs>,
#[serde(default)]
pub execution_deadline_at: Option<TimestampMs>,
pub partition_id: u16,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum CreateExecutionResult {
Created {
execution_id: ExecutionId,
public_state: PublicState,
},
Duplicate { execution_id: ExecutionId },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct IssueClaimGrantArgs {
pub execution_id: ExecutionId,
pub lane_id: LaneId,
pub worker_id: WorkerId,
pub worker_instance_id: WorkerInstanceId,
#[serde(default)]
pub capability_hash: Option<String>,
#[serde(default)]
pub route_snapshot_json: Option<String>,
#[serde(default)]
pub admission_summary: Option<String>,
#[serde(default)]
pub worker_capabilities: BTreeSet<String>,
pub grant_ttl_ms: u64,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum IssueClaimGrantResult {
Granted { execution_id: ExecutionId },
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ClaimGrant {
pub execution_id: ExecutionId,
pub partition: crate::partition::Partition,
pub grant_key: String,
pub expires_at_ms: u64,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ReclaimGrant {
pub execution_id: ExecutionId,
pub partition: crate::partition::Partition,
pub grant_key: String,
pub expires_at_ms: u64,
pub lane_id: LaneId,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ClaimExecutionArgs {
pub execution_id: ExecutionId,
pub worker_id: WorkerId,
pub worker_instance_id: WorkerInstanceId,
pub lane_id: LaneId,
pub lease_id: LeaseId,
pub lease_ttl_ms: u64,
pub attempt_id: AttemptId,
pub expected_attempt_index: AttemptIndex,
#[serde(default)]
pub attempt_policy_json: String,
#[serde(default)]
pub attempt_timeout_ms: Option<u64>,
#[serde(default)]
pub execution_deadline_at: Option<i64>,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ClaimedExecution {
pub execution_id: ExecutionId,
pub lease_id: LeaseId,
pub lease_epoch: LeaseEpoch,
pub attempt_index: AttemptIndex,
pub attempt_id: AttemptId,
pub attempt_type: AttemptType,
pub lease_expires_at: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ClaimExecutionResult {
Claimed(ClaimedExecution),
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CompleteExecutionArgs {
pub execution_id: ExecutionId,
pub lease_id: LeaseId,
pub lease_epoch: LeaseEpoch,
pub attempt_index: AttemptIndex,
pub attempt_id: AttemptId,
#[serde(default)]
pub result_payload: Option<Vec<u8>>,
#[serde(default)]
pub result_encoding: Option<String>,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum CompleteExecutionResult {
Completed {
execution_id: ExecutionId,
public_state: PublicState,
},
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RenewLeaseArgs {
pub execution_id: ExecutionId,
pub attempt_index: AttemptIndex,
pub attempt_id: AttemptId,
pub lease_id: LeaseId,
pub lease_epoch: LeaseEpoch,
pub lease_ttl_ms: u64,
#[serde(default = "default_lease_history_grace_ms")]
pub lease_history_grace_ms: u64,
}
fn default_lease_history_grace_ms() -> u64 {
60_000
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum RenewLeaseResult {
Renewed { expires_at: TimestampMs },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MarkLeaseExpiredArgs {
pub execution_id: ExecutionId,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum MarkLeaseExpiredResult {
MarkedExpired,
AlreadySatisfied { reason: String },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CancelExecutionArgs {
pub execution_id: ExecutionId,
pub reason: String,
#[serde(default)]
pub source: CancelSource,
#[serde(default)]
pub lease_id: Option<LeaseId>,
#[serde(default)]
pub lease_epoch: Option<LeaseEpoch>,
#[serde(default)]
pub attempt_id: Option<AttemptId>,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum CancelExecutionResult {
Cancelled {
execution_id: ExecutionId,
public_state: PublicState,
},
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RevokeLeaseArgs {
pub execution_id: ExecutionId,
#[serde(default)]
pub expected_lease_id: Option<String>,
pub worker_instance_id: WorkerInstanceId,
pub reason: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum RevokeLeaseResult {
Revoked { lease_id: String, lease_epoch: String },
AlreadySatisfied { reason: String },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct DelayExecutionArgs {
pub execution_id: ExecutionId,
pub lease_id: LeaseId,
pub lease_epoch: LeaseEpoch,
pub attempt_index: AttemptIndex,
pub attempt_id: AttemptId,
pub delay_until: TimestampMs,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum DelayExecutionResult {
Delayed {
execution_id: ExecutionId,
public_state: PublicState,
},
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MoveToWaitingChildrenArgs {
pub execution_id: ExecutionId,
pub lease_id: LeaseId,
pub lease_epoch: LeaseEpoch,
pub attempt_index: AttemptIndex,
pub attempt_id: AttemptId,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum MoveToWaitingChildrenResult {
Moved {
execution_id: ExecutionId,
public_state: PublicState,
},
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ChangePriorityArgs {
pub execution_id: ExecutionId,
pub new_priority: i32,
pub lane_id: LaneId,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ChangePriorityResult {
Changed { execution_id: ExecutionId },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct UpdateProgressArgs {
pub execution_id: ExecutionId,
pub lease_id: LeaseId,
pub lease_epoch: LeaseEpoch,
pub attempt_id: AttemptId,
#[serde(default)]
pub progress_pct: Option<u8>,
#[serde(default)]
pub progress_message: Option<String>,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum UpdateProgressResult {
Updated,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct FailExecutionArgs {
pub execution_id: ExecutionId,
pub lease_id: LeaseId,
pub lease_epoch: LeaseEpoch,
pub attempt_index: AttemptIndex,
pub attempt_id: AttemptId,
pub failure_reason: String,
pub failure_category: String,
#[serde(default)]
pub retry_policy_json: String,
#[serde(default)]
pub next_attempt_policy_json: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum FailExecutionResult {
RetryScheduled {
delay_until: TimestampMs,
next_attempt_index: AttemptIndex,
},
TerminalFailed,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct IssueReclaimGrantArgs {
pub execution_id: ExecutionId,
pub worker_id: WorkerId,
pub worker_instance_id: WorkerInstanceId,
pub lane_id: LaneId,
#[serde(default)]
pub capability_hash: Option<String>,
pub grant_ttl_ms: u64,
#[serde(default)]
pub route_snapshot_json: Option<String>,
#[serde(default)]
pub admission_summary: Option<String>,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum IssueReclaimGrantResult {
Granted { expires_at_ms: TimestampMs },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ReclaimExecutionArgs {
pub execution_id: ExecutionId,
pub worker_id: WorkerId,
pub worker_instance_id: WorkerInstanceId,
pub lane_id: LaneId,
#[serde(default)]
pub capability_hash: Option<String>,
pub lease_id: LeaseId,
pub lease_ttl_ms: u64,
pub attempt_id: AttemptId,
#[serde(default)]
pub attempt_policy_json: String,
#[serde(default = "default_max_reclaim_count")]
pub max_reclaim_count: u32,
pub old_worker_instance_id: WorkerInstanceId,
pub current_attempt_index: AttemptIndex,
}
fn default_max_reclaim_count() -> u32 {
100
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ReclaimExecutionResult {
Reclaimed {
new_attempt_index: AttemptIndex,
new_attempt_id: AttemptId,
new_lease_id: LeaseId,
new_lease_epoch: LeaseEpoch,
lease_expires_at: TimestampMs,
},
MaxReclaimsExceeded,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ExpireExecutionArgs {
pub execution_id: ExecutionId,
pub expire_reason: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ExpireExecutionResult {
Expired { execution_id: ExecutionId },
AlreadyTerminal,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SuspendExecutionArgs {
pub execution_id: ExecutionId,
pub lease_id: LeaseId,
pub lease_epoch: LeaseEpoch,
pub attempt_index: AttemptIndex,
pub attempt_id: AttemptId,
pub suspension_id: SuspensionId,
pub waitpoint_id: WaitpointId,
pub waitpoint_key: String,
pub reason_code: String,
pub requested_by: String,
pub resume_condition_json: String,
pub resume_policy_json: String,
#[serde(default)]
pub continuation_metadata_pointer: Option<String>,
#[serde(default)]
pub timeout_at: Option<TimestampMs>,
#[serde(default)]
pub use_pending_waitpoint: bool,
#[serde(default = "default_timeout_behavior")]
pub timeout_behavior: String,
}
fn default_timeout_behavior() -> String {
"fail".to_owned()
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum SuspendExecutionResult {
Suspended {
suspension_id: SuspensionId,
waitpoint_id: WaitpointId,
waitpoint_key: String,
waitpoint_token: WaitpointToken,
},
AlreadySatisfied {
suspension_id: SuspensionId,
waitpoint_id: WaitpointId,
waitpoint_key: String,
waitpoint_token: WaitpointToken,
},
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ResumeExecutionArgs {
pub execution_id: ExecutionId,
#[serde(default = "default_trigger_type")]
pub trigger_type: String,
#[serde(default)]
pub resume_delay_ms: u64,
}
fn default_trigger_type() -> String {
"signal".to_owned()
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ResumeExecutionResult {
Resumed { public_state: PublicState },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CreatePendingWaitpointArgs {
pub execution_id: ExecutionId,
pub lease_id: LeaseId,
pub lease_epoch: LeaseEpoch,
pub attempt_index: AttemptIndex,
pub attempt_id: AttemptId,
pub waitpoint_id: WaitpointId,
pub waitpoint_key: String,
pub expires_in_ms: u64,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum CreatePendingWaitpointResult {
Created {
waitpoint_id: WaitpointId,
waitpoint_key: String,
waitpoint_token: WaitpointToken,
},
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CloseWaitpointArgs {
pub waitpoint_id: WaitpointId,
pub reason: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum CloseWaitpointResult {
Closed,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct DeliverSignalArgs {
pub execution_id: ExecutionId,
pub waitpoint_id: WaitpointId,
pub signal_id: SignalId,
pub signal_name: String,
pub signal_category: String,
pub source_type: String,
pub source_identity: String,
#[serde(default)]
pub payload: Option<Vec<u8>>,
#[serde(default)]
pub payload_encoding: Option<String>,
#[serde(default)]
pub correlation_id: Option<String>,
#[serde(default)]
pub idempotency_key: Option<String>,
pub target_scope: String,
#[serde(default)]
pub created_at: Option<TimestampMs>,
#[serde(default)]
pub dedup_ttl_ms: Option<u64>,
#[serde(default)]
pub resume_delay_ms: Option<u64>,
#[serde(default)]
pub max_signals_per_execution: Option<u64>,
#[serde(default)]
pub signal_maxlen: Option<u64>,
pub waitpoint_token: WaitpointToken,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum DeliverSignalResult {
Accepted {
signal_id: SignalId,
effect: String,
},
Duplicate { existing_signal_id: SignalId },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct BufferSignalArgs {
pub execution_id: ExecutionId,
pub waitpoint_id: WaitpointId,
pub signal_id: SignalId,
pub signal_name: String,
pub signal_category: String,
pub source_type: String,
pub source_identity: String,
#[serde(default)]
pub payload: Option<Vec<u8>>,
#[serde(default)]
pub payload_encoding: Option<String>,
#[serde(default)]
pub idempotency_key: Option<String>,
pub target_scope: String,
pub waitpoint_token: WaitpointToken,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum BufferSignalResult {
Buffered { signal_id: SignalId },
Duplicate { existing_signal_id: SignalId },
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PendingWaitpointInfo {
pub waitpoint_id: WaitpointId,
pub waitpoint_key: String,
pub state: String,
pub waitpoint_token: WaitpointToken,
#[serde(default)]
pub required_signal_names: Vec<String>,
pub created_at: TimestampMs,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub activated_at: Option<TimestampMs>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expires_at: Option<TimestampMs>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ExpireSuspensionArgs {
pub execution_id: ExecutionId,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ExpireSuspensionResult {
Expired { behavior_applied: String },
AlreadySatisfied { reason: String },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ClaimResumedExecutionArgs {
pub execution_id: ExecutionId,
pub worker_id: WorkerId,
pub worker_instance_id: WorkerInstanceId,
pub lane_id: LaneId,
pub lease_id: LeaseId,
pub lease_ttl_ms: u64,
pub current_attempt_index: AttemptIndex,
#[serde(default)]
pub remaining_attempt_timeout_ms: Option<u64>,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ClaimedResumedExecution {
pub execution_id: ExecutionId,
pub lease_id: LeaseId,
pub lease_epoch: LeaseEpoch,
pub attempt_index: AttemptIndex,
pub attempt_id: AttemptId,
pub lease_expires_at: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ClaimResumedExecutionResult {
Claimed(ClaimedResumedExecution),
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct AppendFrameArgs {
pub execution_id: ExecutionId,
pub attempt_index: AttemptIndex,
pub lease_id: LeaseId,
pub lease_epoch: LeaseEpoch,
pub attempt_id: AttemptId,
pub frame_type: String,
pub timestamp: TimestampMs,
pub payload: Vec<u8>,
#[serde(default)]
pub encoding: Option<String>,
#[serde(default)]
pub metadata_json: Option<String>,
#[serde(default)]
pub correlation_id: Option<String>,
#[serde(default)]
pub source: Option<String>,
#[serde(default)]
pub retention_maxlen: Option<u32>,
#[serde(default)]
pub max_payload_bytes: Option<u32>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum AppendFrameResult {
Appended {
entry_id: String,
frame_count: u64,
},
}
pub const STREAM_READ_HARD_CAP: u64 = 10_000;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct StreamFrame {
pub id: String,
pub fields: std::collections::BTreeMap<String, String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ReadFramesArgs {
pub execution_id: ExecutionId,
pub attempt_index: AttemptIndex,
pub from_id: String,
pub to_id: String,
pub count_limit: u64,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct StreamFrames {
pub frames: Vec<StreamFrame>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub closed_at: Option<TimestampMs>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub closed_reason: Option<String>,
}
impl StreamFrames {
pub fn empty_open() -> Self {
Self { frames: Vec::new(), closed_at: None, closed_reason: None }
}
pub fn is_closed(&self) -> bool {
self.closed_at.is_some()
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ReadFramesResult {
Frames(StreamFrames),
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CreateBudgetArgs {
pub budget_id: crate::types::BudgetId,
pub scope_type: String,
pub scope_id: String,
pub enforcement_mode: String,
pub on_hard_limit: String,
pub on_soft_limit: String,
pub reset_interval_ms: u64,
pub dimensions: Vec<String>,
pub hard_limits: Vec<u64>,
pub soft_limits: Vec<u64>,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum CreateBudgetResult {
Created { budget_id: crate::types::BudgetId },
AlreadySatisfied { budget_id: crate::types::BudgetId },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CreateQuotaPolicyArgs {
pub quota_policy_id: crate::types::QuotaPolicyId,
pub window_seconds: u64,
pub max_requests_per_window: u64,
pub max_concurrent: u64,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum CreateQuotaPolicyResult {
Created { quota_policy_id: crate::types::QuotaPolicyId },
AlreadySatisfied { quota_policy_id: crate::types::QuotaPolicyId },
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct BudgetStatus {
pub budget_id: String,
pub scope_type: String,
pub scope_id: String,
pub enforcement_mode: String,
pub usage: HashMap<String, u64>,
pub hard_limits: HashMap<String, u64>,
pub soft_limits: HashMap<String, u64>,
pub breach_count: u64,
pub soft_breach_count: u64,
pub last_breach_at: Option<String>,
pub last_breach_dim: Option<String>,
pub next_reset_at: Option<String>,
pub created_at: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ReportUsageArgs {
pub dimensions: Vec<String>,
pub deltas: Vec<u64>,
pub now: TimestampMs,
#[serde(default)]
pub dedup_key: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ReportUsageResult {
Ok,
SoftBreach {
dimension: String,
current_usage: u64,
soft_limit: u64,
},
HardBreach {
dimension: String,
current_usage: u64,
hard_limit: u64,
},
AlreadyApplied,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ResetBudgetArgs {
pub budget_id: crate::types::BudgetId,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ResetBudgetResult {
Reset { next_reset_at: TimestampMs },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CheckAdmissionArgs {
pub execution_id: ExecutionId,
pub now: TimestampMs,
pub window_seconds: u64,
pub rate_limit: u64,
pub concurrency_cap: u64,
#[serde(default)]
pub jitter_ms: Option<u64>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum CheckAdmissionResult {
Admitted,
AlreadyAdmitted,
RateExceeded { retry_after_ms: u64 },
ConcurrencyExceeded,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ReleaseAdmissionArgs {
pub execution_id: ExecutionId,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ReleaseAdmissionResult {
Released,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct BlockExecutionArgs {
pub execution_id: ExecutionId,
pub blocking_reason: String,
#[serde(default)]
pub blocking_detail: Option<String>,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum BlockExecutionResult {
Blocked,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct UnblockExecutionArgs {
pub execution_id: ExecutionId,
pub now: TimestampMs,
#[serde(default)]
pub expected_blocking_reason: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum UnblockExecutionResult {
Unblocked,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CreateFlowArgs {
pub flow_id: crate::types::FlowId,
pub flow_kind: String,
pub namespace: Namespace,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum CreateFlowResult {
Created { flow_id: crate::types::FlowId },
AlreadySatisfied { flow_id: crate::types::FlowId },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct AddExecutionToFlowArgs {
pub flow_id: crate::types::FlowId,
pub execution_id: ExecutionId,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum AddExecutionToFlowResult {
Added {
execution_id: ExecutionId,
new_node_count: u32,
},
AlreadyMember {
execution_id: ExecutionId,
node_count: u32,
},
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CancelFlowArgs {
pub flow_id: crate::types::FlowId,
pub reason: String,
pub cancellation_policy: String,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum CancelFlowResult {
Cancelled {
cancellation_policy: String,
member_execution_ids: Vec<String>,
},
CancellationScheduled {
cancellation_policy: String,
member_count: u32,
member_execution_ids: Vec<String>,
},
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct StageDependencyEdgeArgs {
pub flow_id: crate::types::FlowId,
pub edge_id: crate::types::EdgeId,
pub upstream_execution_id: ExecutionId,
pub downstream_execution_id: ExecutionId,
#[serde(default = "default_dependency_kind")]
pub dependency_kind: String,
#[serde(default)]
pub data_passing_ref: Option<String>,
pub expected_graph_revision: u64,
pub now: TimestampMs,
}
fn default_dependency_kind() -> String {
"success_only".to_owned()
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum StageDependencyEdgeResult {
Staged {
edge_id: crate::types::EdgeId,
new_graph_revision: u64,
},
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ApplyDependencyToChildArgs {
pub flow_id: crate::types::FlowId,
pub edge_id: crate::types::EdgeId,
pub downstream_execution_id: ExecutionId,
pub upstream_execution_id: ExecutionId,
pub graph_revision: u64,
#[serde(default = "default_dependency_kind")]
pub dependency_kind: String,
#[serde(default)]
pub data_passing_ref: Option<String>,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ApplyDependencyToChildResult {
Applied { unsatisfied_count: u32 },
AlreadyApplied,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ResolveDependencyArgs {
pub edge_id: crate::types::EdgeId,
pub upstream_outcome: String,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ResolveDependencyResult {
Satisfied,
Impossible,
AlreadyResolved,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct PromoteBlockedToEligibleArgs {
pub execution_id: ExecutionId,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum PromoteBlockedToEligibleResult {
Promoted,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EvaluateFlowEligibilityArgs {
pub execution_id: ExecutionId,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum EvaluateFlowEligibilityResult {
Status { status: String },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ReplayExecutionArgs {
pub execution_id: ExecutionId,
pub now: TimestampMs,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ReplayExecutionResult {
Replayed { public_state: PublicState },
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ExecutionInfo {
pub execution_id: ExecutionId,
pub namespace: String,
pub lane_id: String,
pub priority: i32,
pub execution_kind: String,
pub state_vector: StateVector,
pub public_state: PublicState,
pub created_at: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub started_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completed_at: Option<String>,
pub current_attempt_index: u32,
pub flow_id: Option<String>,
pub blocking_detail: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct StateSummary {
pub state_vector: StateVector,
pub current_attempt_index: AttemptIndex,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::FlowId;
#[test]
fn create_execution_args_serde() {
let config = crate::partition::PartitionConfig::default();
let args = CreateExecutionArgs {
execution_id: ExecutionId::for_flow(&FlowId::new(), &config),
namespace: Namespace::new("test"),
lane_id: LaneId::new("default"),
execution_kind: "llm_call".to_owned(),
input_payload: b"hello".to_vec(),
payload_encoding: Some("json".to_owned()),
priority: 0,
creator_identity: "test-user".to_owned(),
idempotency_key: None,
tags: HashMap::new(),
policy: None,
delay_until: None,
execution_deadline_at: None,
partition_id: 42,
now: TimestampMs::now(),
};
let json = serde_json::to_string(&args).unwrap();
let parsed: CreateExecutionArgs = serde_json::from_str(&json).unwrap();
assert_eq!(args.execution_id, parsed.execution_id);
}
#[test]
fn claim_result_serde() {
let config = crate::partition::PartitionConfig::default();
let result = ClaimExecutionResult::Claimed(ClaimedExecution {
execution_id: ExecutionId::for_flow(&FlowId::new(), &config),
lease_id: LeaseId::new(),
lease_epoch: LeaseEpoch::new(1),
attempt_index: AttemptIndex::new(0),
attempt_id: AttemptId::new(),
attempt_type: AttemptType::Initial,
lease_expires_at: TimestampMs::from_millis(1000),
});
let json = serde_json::to_string(&result).unwrap();
let parsed: ClaimExecutionResult = serde_json::from_str(&json).unwrap();
assert_eq!(result, parsed);
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ExecutionSummary {
pub execution_id: ExecutionId,
pub namespace: String,
pub lane_id: String,
pub execution_kind: String,
pub public_state: String,
pub priority: i32,
pub created_at: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ListExecutionsResult {
pub executions: Vec<ExecutionSummary>,
pub total_returned: usize,
}