use super::OptionValueExt;
use meerkat_machine_dsl::machine;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct SessionId(pub String);
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct AgentRuntimeId(pub String);
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct FenceToken(pub u64);
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct Generation(pub u64);
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct RunId(pub String);
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct InputId(pub String);
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct WorkId(pub String);
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct OperationId(pub String);
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct WaitRequestId(pub String);
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum OperationKind {
#[default]
MobMemberChild,
BackgroundToolOp,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum Provider {
#[default]
Anthropic,
OpenAI,
Gemini,
SelfHosted,
Other,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct AuthBindingRef {
pub realm_id: String,
pub binding_id: String,
pub profile_id: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct SessionLlmIdentity {
pub model: String,
pub provider: Provider,
pub self_hosted_server_id: Option<String>,
pub provider_params_repr: Option<String>,
pub auth_binding: Option<AuthBindingRef>,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct SessionToolVisibilityState {
pub capability_base_filter: ToolFilter,
pub inherited_base_filter: ToolFilter,
pub active_filter: ToolFilter,
pub staged_filter: ToolFilter,
pub active_requested_deferred_names: std::collections::BTreeSet<String>,
pub staged_requested_deferred_names: std::collections::BTreeSet<String>,
pub active_revision: u64,
pub staged_revision: u64,
pub requested_witnesses: std::collections::BTreeMap<String, ToolVisibilityWitness>,
pub filter_witnesses: std::collections::BTreeMap<String, ToolVisibilityWitness>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct SessionLlmCapabilitySurface {
pub supports_temperature: bool,
pub supports_thinking: bool,
pub supports_reasoning: bool,
pub inline_video: bool,
pub vision: bool,
pub image_input: bool,
pub image_tool_results: bool,
pub supports_web_search: bool,
pub image_generation: bool,
pub realtime: bool,
pub call_timeout_secs: Option<u64>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum SessionLlmCapabilitySurfaceStatus {
Resolved,
#[default]
Unresolved,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct SessionToolVisibilityDelta {
pub previous_capability_base_filter: ToolFilter,
pub current_capability_base_filter: ToolFilter,
pub committed_visible_set_changed: bool,
pub revision_bumped: bool,
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Default,
serde::Serialize,
serde::Deserialize,
)]
pub enum ToolFilter {
#[default]
All,
Allow(std::collections::BTreeSet<String>),
Deny(std::collections::BTreeSet<String>),
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Default,
serde::Serialize,
serde::Deserialize,
)]
pub enum ToolSourceKind {
#[default]
Builtin,
Shell,
Comms,
Memory,
Schedule,
WorkGraph,
Mob,
Callback,
Mcp,
RustBundle,
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Default,
serde::Serialize,
serde::Deserialize,
)]
pub struct ToolProvenance {
pub kind: ToolSourceKind,
pub source_id: String,
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Default,
serde::Serialize,
serde::Deserialize,
)]
pub struct ToolVisibilityWitness {
pub stable_owner_key: Option<String>,
pub last_seen_provenance: Option<ToolProvenance>,
}
impl ToolVisibilityWitness {
fn len(&self) -> u64 {
u64::from(self.last_seen_provenance.is_some())
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct McpServerId(pub String);
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct PeerCorrelationId(pub String);
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum OutboundPeerRequestState {
#[default]
Sent,
AcceptedProgress,
Completed,
Failed,
TimedOut,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum InboundPeerRequestState {
#[default]
Received,
Replied,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum PeerTerminalDisposition {
#[default]
Completed,
Failed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum InteractionStreamState {
#[default]
Reserved,
Attached,
Completed,
Expired,
ClosedEarly,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum McpServerState {
#[default]
PendingConnect,
Connected,
Failed,
Disconnected,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct CommsRuntimeId(pub String);
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct MobId(pub String);
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum PeerIngressEnvelopeClass {
#[default]
Message,
Request,
Lifecycle,
Response,
Ack,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum PeerIngressAdmittedKind {
#[default]
Message,
Request,
Response,
Ack,
PlainEvent,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum PeerIngressInputClass {
#[default]
ActionableMessage,
ActionableRequest,
ResponseProgress,
ResponseTerminal,
PeerLifecycleAdded,
PeerLifecycleRetired,
PeerLifecycleUnwired,
SilentRequest,
Ack,
PlainEvent,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum PeerIngressLifecycleClass {
#[default]
PeerAdded,
PeerRetired,
PeerUnwired,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum PeerIngressAuthClass {
#[default]
Required,
SupervisorBridgeExempt,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum PeerIngressResponseStatus {
#[default]
Accepted,
Completed,
Failed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum PeerIngressResponseTerminality {
#[default]
Progress,
TerminalCompleted,
TerminalFailed,
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Default,
serde::Serialize,
serde::Deserialize,
)]
pub enum PeerIngressOwnerKind {
#[default]
Unattached,
SessionOwned,
MobOwned,
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Default,
serde::Serialize,
serde::Deserialize,
)]
pub enum SupervisorBindingKind {
#[default]
Unbound,
Bound,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum TurnPhase {
#[default]
Ready,
ApplyingPrimitive,
CallingLlm,
WaitingForOps,
DrainingBoundary,
Extracting,
ErrorRecovery,
Cancelling,
Completed,
Failed,
Cancelled,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum RegistrationPhase {
#[default]
Queuing,
Active,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum DrainPhase {
#[default]
Inactive,
Running,
Stopped,
ExitedRespawnable,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum DrainMode {
#[default]
Timed,
AttachedSession,
PersistentHost,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum SurfacePhase {
#[default]
Operating,
Shutdown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum InputPhase {
#[default]
Queued,
Staged,
Applied,
AppliedPendingConsumption,
Consumed,
Superseded,
Coalesced,
Abandoned,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum InputTerminalKind {
#[default]
Consumed,
Superseded,
Coalesced,
Abandoned,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum SurfacePendingOp {
#[default]
None,
Add,
Reload,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum SurfaceStagedOp {
#[default]
None,
Add,
Remove,
Reload,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum TurnPrimitiveKind {
#[default]
None,
ConversationTurn,
ImmediateAppend,
ImmediateContextAppend,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum ContentShape {
#[default]
Conversation,
ConversationAndContext,
Context,
Empty,
ImmediateAppend,
ImmediateContext,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum TurnTerminalOutcome {
#[default]
None,
Completed,
Failed,
Cancelled,
BudgetExhausted,
TimeBudgetExceeded,
StructuredOutputValidationFailed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum TurnTerminalCauseKind {
#[default]
Unknown,
HookDenied,
HookFailure,
LlmFailure,
ToolFailure,
StructuredOutputValidationFailed,
BudgetExhausted,
TimeBudgetExceeded,
RetryExhausted,
TurnLimitReached,
RuntimeApplyFailure,
FatalFailure,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum RuntimeApplyFailureCause {
#[default]
Unknown,
PrimitiveRejected,
RuntimeContextApply,
RuntimeTurn,
HookDenied,
HookRuntimeFailure,
ExecutorStopped,
ExecutorControlFailed,
ExecutorInternal,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum PreRunPhase {
#[default]
Idle,
Attached,
Retired,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum RuntimeNoticeKind {
#[default]
Drain,
Reset,
Stop,
Exit,
Recover,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum RuntimeEffectKind {
#[default]
CancelAfterBoundary,
StopRuntimeExecutor,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum TurnCancellationReason {
#[default]
Observed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum LlmRetryFailureKind {
#[default]
RateLimited,
NetworkTimeout,
CallTimeout,
RetryableProviderError,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum PostAdmissionSignalKind {
#[default]
WakeLoop,
InterruptYielding,
RequestImmediateProcessing,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum ExternalToolSurfaceBaseState {
#[default]
Absent,
Active,
Removing,
Removed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum ExternalToolSurfaceDeltaOperation {
#[default]
None,
Add,
Remove,
Reload,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum ExternalToolSurfaceDeltaPhase {
#[default]
None,
Pending,
Applied,
Draining,
Failed,
Forced,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum ExternalToolSurfaceFailureCause {
#[default]
PendingFailed,
SurfaceDraining,
SurfaceUnavailable,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum DrainExitReason {
#[default]
IdleTimeout,
Dismissed,
Failed,
Aborted,
SessionShutdown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum WorkOrigin {
#[default]
External,
Internal,
Ingest,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum OperationStatus {
#[default]
Absent,
Provisioning,
Running,
Retiring,
Completed,
Failed,
Aborted,
Cancelled,
Retired,
Terminated,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum OperationTerminalOutcomeKind {
#[default]
Completed,
Failed,
Aborted,
Cancelled,
Retired,
Terminated,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum InputAbandonReason {
#[default]
Retired,
Reset,
Stopped,
Destroyed,
Cancelled,
MaxAttemptsExhausted,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum InputLane {
#[default]
Queue,
Steer,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum RoutingSwitchTurnPhase {
#[default]
Requested,
PendingForBoundary,
ActiveFiniteOverride,
ApplyingPersistentReconfigure,
Terminal,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum RoutingSwitchTurnTerminal {
#[default]
Denied,
ConsumedAndRestored,
PersistentReconfigureApplied,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum RoutingDenialReason {
#[default]
CapabilityPolicy,
ApprovalRequiredButUnavailable,
DeniedDuringApproval,
ScopedOverrideConflict,
RealtimeTransportConflict,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum RoutingApprovalPhase {
#[default]
Pending,
PresentedToUser,
Approved,
Denied,
SurfaceDetached,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum RoutingApprovalParentKind {
#[default]
SwitchTurn,
ImageOperation,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum RoutingImageOperationPhase {
#[default]
Requested,
PlanResolved,
ScopedOverrideActive,
ProviderCallInFlight,
ResultCommitted,
RestoringScopedOverride,
Terminal,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub enum RoutingImageTerminal {
#[default]
Generated,
Denied,
EmptyResult,
RefusedByProvider,
SafetyFiltered,
Failed,
Cancelled,
Timeout,
ScopedRestoreFailed,
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Default,
serde::Serialize,
serde::Deserialize,
)]
pub struct PeerEndpoint {
pub name: PeerName,
pub peer_id: PeerId,
pub address: PeerAddress,
pub signing_key: PeerSigningKey,
}
impl PeerEndpoint {
pub fn new(
name: impl Into<PeerName>,
peer_id: impl Into<PeerId>,
address: impl Into<PeerAddress>,
signing_key: impl Into<PeerSigningKey>,
) -> Self {
Self {
name: name.into(),
peer_id: peer_id.into(),
address: address.into(),
signing_key: signing_key.into(),
}
}
}
impl From<&meerkat_core::comms::TrustedPeerDescriptor> for PeerEndpoint {
fn from(spec: &meerkat_core::comms::TrustedPeerDescriptor) -> Self {
Self {
name: PeerName(spec.name.as_str().to_owned()),
peer_id: PeerId(spec.peer_id.to_string()),
address: PeerAddress(spec.address.to_string()),
signing_key: PeerSigningKey(spec.pubkey),
}
}
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Default,
serde::Serialize,
serde::Deserialize,
)]
pub struct PeerSigningKey(pub [u8; 32]);
impl From<[u8; 32]> for PeerSigningKey {
fn from(key: [u8; 32]) -> Self {
Self(key)
}
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Default,
serde::Serialize,
serde::Deserialize,
)]
pub struct PeerName(pub String);
impl<T: Into<String>> From<T> for PeerName {
fn from(s: T) -> Self {
Self(s.into())
}
}
impl PeerName {
pub fn as_str(&self) -> &str {
&self.0
}
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Default,
serde::Serialize,
serde::Deserialize,
)]
pub struct PeerId(pub String);
impl<T: Into<String>> From<T> for PeerId {
fn from(s: T) -> Self {
Self(s.into())
}
}
impl PeerId {
pub fn as_str(&self) -> &str {
&self.0
}
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Default,
serde::Serialize,
serde::Deserialize,
)]
pub struct PeerAddress(pub String);
impl<T: Into<String>> From<T> for PeerAddress {
fn from(s: T) -> Self {
Self(s.into())
}
}
impl PeerAddress {
pub fn as_str(&self) -> &str {
&self.0
}
}
#[macro_export]
macro_rules! meerkat_catalog_machine_dsl {
($rust_crate:literal, $rust_module:literal) => {
machine! {
machine MeerkatMachine {
version: 1,
rust: $rust_crate / $rust_module,
state {
lifecycle_phase: MeerkatPhase,
session_id: Option<SessionId>,
active_runtime_id: Option<AgentRuntimeId>,
active_fence_token: Option<FenceToken>,
current_run_id: Option<RunId>,
pre_run_phase: Option<Enum<PreRunPhase>>,
turn_phase: TurnPhase,
primitive_kind: Option<Enum<TurnPrimitiveKind>>,
admitted_content_shape: Option<Enum<ContentShape>>,
vision_enabled: bool,
image_tool_results_enabled: bool,
tool_calls_pending: u64,
pending_op_refs: Set<String>,
barrier_operation_ids: Set<String>,
has_barrier_ops: bool,
barrier_satisfied: bool,
boundary_count: u64,
cancel_after_boundary: bool,
terminal_outcome: Option<Enum<TurnTerminalOutcome>>,
terminal_cause_kind: Option<Enum<TurnTerminalCauseKind>>,
last_runtime_apply_failure_cause: Option<Enum<RuntimeApplyFailureCause>>,
last_runtime_apply_failure_message: Option<String>,
extraction_attempts: u64,
max_extraction_retries: u64,
llm_retry_attempt: u64,
llm_retry_max_retries: u64,
llm_retry_selected_delay_ms: u64,
llm_retry_last_failure_kind: Option<Enum<LlmRetryFailureKind>>,
silent_intent_overrides: Set<String>,
model_routing_baseline_model: Option<String>,
model_routing_baseline_realtime: Option<bool>,
model_routing_topology_epoch: u64,
model_routing_turn_override_id: Option<String>,
model_routing_turn_request_id: Option<String>,
model_routing_turn_target_model: Option<String>,
model_routing_turn_realtime: Option<bool>,
model_routing_turn_remaining_turns: Option<u64>,
model_routing_operation_override_id: Option<String>,
model_routing_operation_target_model: Option<String>,
model_routing_operation_realtime: Option<bool>,
model_routing_pending_switch_request_id: Option<String>,
model_routing_pending_switch_target_model: Option<String>,
model_routing_pending_switch_realtime: Option<bool>,
model_routing_pending_switch_turns: Option<u64>,
model_routing_pending_switch_phase: Option<Enum<RoutingSwitchTurnPhase>>,
model_routing_switch_terminal: Map<String, Enum<RoutingSwitchTurnTerminal>>,
model_routing_switch_denials: Map<String, Enum<RoutingDenialReason>>,
model_routing_image_operation_phases: Map<String, Enum<RoutingImageOperationPhase>>,
model_routing_image_operation_target_models: Map<String, String>,
model_routing_image_operation_realtime: Map<String, bool>,
model_routing_image_operation_requires_scoped_override: Map<String, bool>,
model_routing_image_terminals: Map<String, Enum<RoutingImageTerminal>>,
model_routing_image_terminal_payloads: Map<String, String>,
model_routing_image_denials: Map<String, Enum<RoutingDenialReason>>,
model_routing_approval_phases: Map<String, Enum<RoutingApprovalPhase>>,
model_routing_approval_parent_kind: Map<String, Enum<RoutingApprovalParentKind>>,
registration_phase: RegistrationPhase,
drain_phase: DrainPhase,
drain_mode: Option<DrainMode>,
next_staged_visibility_revision: u64,
active_filter: ToolFilter,
staged_filter: ToolFilter,
active_visibility_revision: u64,
staged_visibility_revision: u64,
active_deferred_names: Set<String>,
staged_deferred_names: Set<String>,
active_deferred_authorities: Map<String, ToolVisibilityWitness>,
staged_deferred_authorities: Map<String, ToolVisibilityWitness>,
input_phases: Map<String, InputPhase>,
input_terminal_kind: Map<String, InputTerminalKind>,
input_superseded_by: Map<String, String>,
input_aggregate_id: Map<String, String>,
input_abandon_reason: Map<String, Enum<InputAbandonReason>>,
input_abandon_attempt_count: Map<String, u64>,
input_attempt_counts: Map<String, u64>,
input_run_associations: Map<String, String>,
input_boundary_sequences: Map<String, u64>,
next_admission_seq: u64,
input_admission_seq: Map<String, u64>,
input_lane: Map<String, Enum<InputLane>>,
op_statuses: Map<String, Enum<OperationStatus>>,
op_completion_seq: Map<String, u64>,
op_terminal_outcomes: Map<String, Enum<OperationTerminalOutcomeKind>>,
op_terminal_payload: Map<String, String>,
op_kinds: Map<String, Enum<OperationKind>>,
op_peer_ready: Map<String, bool>,
op_progress_counts: Map<String, u64>,
active_op_count: u64,
wait_active: bool,
wait_request_id: Option<WaitRequestId>,
wait_operation_ids: Set<String>,
wait_operation_id_tokens: Set<OperationId>,
next_completion_seq: u64,
known_surfaces: Set<String>,
active_surfaces: Set<String>,
visible_surfaces: Set<String>,
surface_base_state: Map<String, Enum<ExternalToolSurfaceBaseState>>,
surface_pending_op: Map<String, SurfacePendingOp>,
surface_staged_op: Map<String, SurfaceStagedOp>,
reload_staged_surfaces: Set<String>,
surface_staged_intent_sequence: Map<String, u64>,
next_staged_intent_sequence: u64,
surface_pending_task_sequence: Map<String, u64>,
next_pending_task_sequence: u64,
surface_pending_lineage_sequence: Map<String, u64>,
surface_inflight_calls: Map<String, u64>,
surface_last_delta_operation: Map<String, Enum<ExternalToolSurfaceDeltaOperation>>,
surface_last_delta_phase: Map<String, Enum<ExternalToolSurfaceDeltaPhase>>,
snapshot_epoch: u64,
snapshot_aligned_epoch: u64,
surface_draining_since_ms: Map<String, u64>,
surface_removal_timeout_at_ms: Map<String, u64>,
surface_removal_applied_at_turn: Map<String, u64>,
surface_phase: SurfacePhase,
removal_timeout_ms: u64,
mcp_server_states: Map<McpServerId, McpServerState>,
pending_peer_requests: Map<PeerCorrelationId, OutboundPeerRequestState>,
inbound_peer_requests: Map<PeerCorrelationId, InboundPeerRequestState>,
last_session_context_updated_at_ms: u64,
reserved_interaction_streams: Set<PeerCorrelationId>,
attached_interaction_streams: Set<PeerCorrelationId>,
peer_ingress_owner_kind: Enum<PeerIngressOwnerKind>,
peer_ingress_comms_runtime_id: Option<CommsRuntimeId>,
peer_ingress_mob_id: Option<MobId>,
supervisor_binding_kind: Enum<SupervisorBindingKind>,
supervisor_bound_name: Option<String>,
supervisor_bound_peer_id: Option<String>,
supervisor_bound_address: Option<String>,
supervisor_bound_epoch: Option<u64>,
local_endpoint: Option<PeerEndpoint>,
direct_peer_endpoints: Set<PeerEndpoint>,
mob_overlay_peer_endpoints: Set<PeerEndpoint>,
peer_projection_epoch: u64,
mob_overlay_epoch: u64,
}
init(Initializing) {
session_id = None,
active_runtime_id = None,
active_fence_token = None,
current_run_id = None,
pre_run_phase = None,
turn_phase = TurnPhase::Ready,
primitive_kind = None,
admitted_content_shape = None,
vision_enabled = false,
image_tool_results_enabled = false,
tool_calls_pending = 0,
pending_op_refs = EmptySet,
barrier_operation_ids = EmptySet,
has_barrier_ops = false,
barrier_satisfied = false,
boundary_count = 0,
cancel_after_boundary = false,
terminal_outcome = None,
terminal_cause_kind = None,
last_runtime_apply_failure_cause = None,
last_runtime_apply_failure_message = None,
extraction_attempts = 0,
max_extraction_retries = 0,
llm_retry_attempt = 0,
llm_retry_max_retries = 0,
llm_retry_selected_delay_ms = 0,
llm_retry_last_failure_kind = None,
silent_intent_overrides = EmptySet,
model_routing_baseline_model = None,
model_routing_baseline_realtime = None,
model_routing_topology_epoch = 0,
model_routing_turn_override_id = None,
model_routing_turn_request_id = None,
model_routing_turn_target_model = None,
model_routing_turn_realtime = None,
model_routing_turn_remaining_turns = None,
model_routing_operation_override_id = None,
model_routing_operation_target_model = None,
model_routing_operation_realtime = None,
model_routing_pending_switch_request_id = None,
model_routing_pending_switch_target_model = None,
model_routing_pending_switch_realtime = None,
model_routing_pending_switch_turns = None,
model_routing_pending_switch_phase = None,
model_routing_switch_terminal = EmptyMap,
model_routing_switch_denials = EmptyMap,
model_routing_image_operation_phases = EmptyMap,
model_routing_image_operation_target_models = EmptyMap,
model_routing_image_operation_realtime = EmptyMap,
model_routing_image_operation_requires_scoped_override = EmptyMap,
model_routing_image_terminals = EmptyMap,
model_routing_image_terminal_payloads = EmptyMap,
model_routing_image_denials = EmptyMap,
model_routing_approval_phases = EmptyMap,
model_routing_approval_parent_kind = EmptyMap,
registration_phase = RegistrationPhase::Queuing,
drain_phase = DrainPhase::Inactive,
drain_mode = None,
next_staged_visibility_revision = 0,
active_filter = ToolFilter::All,
staged_filter = ToolFilter::All,
active_visibility_revision = 0,
staged_visibility_revision = 0,
active_deferred_names = EmptySet,
staged_deferred_names = EmptySet,
active_deferred_authorities = EmptyMap,
staged_deferred_authorities = EmptyMap,
input_phases = EmptyMap,
input_terminal_kind = EmptyMap,
input_superseded_by = EmptyMap,
input_aggregate_id = EmptyMap,
input_abandon_reason = EmptyMap,
input_abandon_attempt_count = EmptyMap,
input_attempt_counts = EmptyMap,
input_run_associations = EmptyMap,
input_boundary_sequences = EmptyMap,
next_admission_seq = 0,
input_admission_seq = EmptyMap,
input_lane = EmptyMap,
op_statuses = EmptyMap,
op_completion_seq = EmptyMap,
op_terminal_outcomes = EmptyMap,
op_terminal_payload = EmptyMap,
op_kinds = EmptyMap,
op_peer_ready = EmptyMap,
op_progress_counts = EmptyMap,
active_op_count = 0,
wait_active = false,
wait_request_id = None,
wait_operation_ids = EmptySet,
wait_operation_id_tokens = EmptySet,
next_completion_seq = 0,
known_surfaces = EmptySet,
active_surfaces = EmptySet,
visible_surfaces = EmptySet,
surface_base_state = EmptyMap,
surface_pending_op = EmptyMap,
surface_staged_op = EmptyMap,
reload_staged_surfaces = EmptySet,
surface_staged_intent_sequence = EmptyMap,
next_staged_intent_sequence = 0,
surface_pending_task_sequence = EmptyMap,
next_pending_task_sequence = 0,
surface_pending_lineage_sequence = EmptyMap,
surface_inflight_calls = EmptyMap,
surface_last_delta_operation = EmptyMap,
surface_last_delta_phase = EmptyMap,
snapshot_epoch = 0,
snapshot_aligned_epoch = 0,
surface_draining_since_ms = EmptyMap,
surface_removal_timeout_at_ms = EmptyMap,
surface_removal_applied_at_turn = EmptyMap,
surface_phase = SurfacePhase::Operating,
removal_timeout_ms = 30000,
mcp_server_states = EmptyMap,
pending_peer_requests = EmptyMap,
inbound_peer_requests = EmptyMap,
last_session_context_updated_at_ms = 0,
reserved_interaction_streams = EmptySet,
attached_interaction_streams = EmptySet,
peer_ingress_owner_kind = PeerIngressOwnerKind::Unattached,
peer_ingress_comms_runtime_id = None,
peer_ingress_mob_id = None,
supervisor_binding_kind = SupervisorBindingKind::Unbound,
supervisor_bound_name = None,
supervisor_bound_peer_id = None,
supervisor_bound_address = None,
supervisor_bound_epoch = None,
local_endpoint = None,
direct_peer_endpoints = EmptySet,
mob_overlay_peer_endpoints = EmptySet,
peer_projection_epoch = 0,
mob_overlay_epoch = 0,
}
terminal [Destroyed]
phase MeerkatPhase {
Initializing,
Idle,
Attached,
Running,
Retired,
Stopped,
Destroyed,
}
input MeerkatMachineInput {
RegisterSession { session_id: SessionId },
UnregisterSession { session_id: SessionId },
ReconfigureSessionLlmIdentity {
previous_identity: SessionLlmIdentity,
previous_visibility_state: SessionToolVisibilityState,
previous_capability_surface: Option<SessionLlmCapabilitySurface>,
previous_capability_surface_status: SessionLlmCapabilitySurfaceStatus,
target_identity: SessionLlmIdentity,
target_capability_surface: SessionLlmCapabilitySurface,
next_visibility_state: SessionToolVisibilityState,
next_capability_base_filter: ToolFilter,
next_active_visibility_revision: u64,
tool_visibility_delta: SessionToolVisibilityDelta,
},
PrepareBindings { agent_runtime_id: AgentRuntimeId, fence_token: FenceToken, generation: Generation, session_id: SessionId },
SetPeerIngressContext { keep_alive: bool },
NotifyDrainExited { reason: Enum<DrainExitReason> },
InterruptCurrentRun,
CancelAfterBoundary { reason: String },
StagePersistentFilter { filter: ToolFilter, witnesses: Map<String, ToolVisibilityWitness> },
RequestDeferredTools { authorities: Map<String, ToolVisibilityWitness> },
PublishCommittedVisibleSet {
active_filter: ToolFilter,
staged_filter: ToolFilter,
active_requested_deferred_names: Set<String>,
staged_requested_deferred_names: Set<String>,
active_deferred_authorities: Map<String, ToolVisibilityWitness>,
staged_deferred_authorities: Map<String, ToolVisibilityWitness>,
active_visibility_revision: u64,
staged_visibility_revision: u64,
},
Recover,
Retire { session_id: SessionId },
Reset,
StopRuntimeExecutor { reason: String },
RuntimeExecutorExited,
Destroy { session_id: SessionId },
EnsureSessionWithExecutor { session_id: SessionId },
SetSilentIntents { session_id: SessionId, intents: Set<String> },
ContainsSession { session_id: SessionId },
SessionHasExecutor { session_id: SessionId },
SessionHasComms { session_id: SessionId },
OpsLifecycleRegistry { session_id: SessionId },
InputState { session_id: SessionId, input_id: InputId },
ListActiveInputs { session_id: SessionId },
Abort { session_id: SessionId },
AbortAll,
Wait { session_id: SessionId },
Ingest { runtime_id: AgentRuntimeId, work_id: WorkId, origin: Enum<WorkOrigin> },
PublishEvent { kind: String },
RuntimeState { runtime_id: String },
ModelRoutingStatus { session_id: SessionId },
SetModelRoutingBaseline { baseline_model: String, realtime_capable: bool },
RequestFiniteSwitchTurn {
request_id: String,
target_model: String,
turns: u64,
target_realtime_capable: bool,
requires_approval: bool,
approval_available: bool,
approval_denied: bool,
realtime_detach_allowed: bool,
},
RequestUntilChangedSwitchTurn {
request_id: String,
target_model: String,
target_realtime_capable: bool,
requires_approval: bool,
approval_available: bool,
approval_denied: bool,
realtime_detach_allowed: bool,
},
CompleteUntilChangedSwitchTurnReconfigure { request_id: String },
AdmitModelRoutingAssistantTurn,
BeginImageOperation {
operation_id: String,
target_model: String,
target_realtime_capable: bool,
requires_approval: bool,
approval_available: bool,
approval_denied: bool,
realtime_detach_allowed: bool,
requires_scoped_override: bool,
},
ActivateImageOperationOverride { operation_id: String, target_model: String, target_realtime_capable: bool },
CompleteImageOperation { operation_id: String, terminal: Enum<RoutingImageTerminal>, terminal_payload: String },
RestoreImageOperationOverride { operation_id: String },
LoadBoundaryReceipt { runtime_id: String, sequence: u64 },
AcceptWithCompletion { input_id: InputId, request_immediate_processing: bool, interrupt_yielding: bool, wake_if_idle: bool },
AcceptWithoutWake { input_id: InputId },
Prepare { session_id: SessionId, run_id: RunId },
Commit { input_id: InputId, run_id: RunId },
Fail { run_id: RunId },
CancelRun { run_id: RunId },
RollbackRun { run_id: RunId },
Recycle,
StartConversationRun {
run_id: RunId,
primitive_kind: Enum<TurnPrimitiveKind>,
admitted_content_shape: Enum<ContentShape>,
vision_enabled: bool,
image_tool_results_enabled: bool,
max_extraction_retries: u64,
},
StartImmediateAppend { run_id: RunId },
StartImmediateContext { run_id: RunId },
PrimitiveApplied,
LlmReturnedToolCalls { tool_count: u64 },
LlmReturnedTerminal,
RegisterPendingOps { op_refs: Set<String>, barrier_operation_ids: Set<String> },
ToolCallsResolved,
OpsBarrierSatisfied { operation_ids: Set<String> },
BoundaryContinue,
BoundaryComplete,
EnterExtraction { max_extraction_retries: u64 },
ExtractionStart,
ExtractionValidationPassed,
ExtractionValidationFailed { error: String },
ExtractionFailed { error: String },
RecoverableFailure {
failure_kind: Enum<LlmRetryFailureKind>,
retry_attempt: u64,
max_retries: u64,
selected_delay_ms: u64,
error: String,
},
FatalFailure { terminal_cause_kind: Enum<TurnTerminalCauseKind>, error: String },
RetryRequested { retry_attempt: u64 },
CancelNow,
RequestCancelAfterBoundary,
CancellationObserved,
AcknowledgeTerminal { outcome: Enum<TurnTerminalOutcome> },
TurnLimitReached,
BudgetExhausted,
TimeBudgetExceeded,
ForceCancelNoRun,
RunCompleted { run_id: RunId },
ServiceTurnCommitted { run_id: RunId },
RunFailed {
run_id: RunId,
runtime_apply_failure_cause: Option<Enum<RuntimeApplyFailureCause>>,
runtime_apply_failure_message: Option<String>,
terminal_outcome: Enum<TurnTerminalOutcome>,
terminal_cause_kind: Enum<TurnTerminalCauseKind>,
error: String,
},
RunCancelled { run_id: RunId },
RecoverInputLifecycle {
input_id: String,
phase: Enum<InputPhase>,
terminal_kind: Option<Enum<InputTerminalKind>>,
superseded_by: Option<String>,
aggregate_id: Option<String>,
abandon_reason: Option<Enum<InputAbandonReason>>,
abandon_attempt_count: u64,
attempt_count: u64,
run_id: Option<String>,
boundary_sequence: Option<u64>,
lane: Option<Enum<InputLane>>,
},
QueueAccepted { input_id: String },
SteerAccepted { input_id: String },
ChangeLane { input_id: String, new_lane: Enum<InputLane> },
StageForRun { input_id: String, run_id: String },
IncrementAttemptCount { input_id: String },
RollbackStaged { input_id: String, lane: Enum<InputLane> },
MarkApplied { input_id: String },
MarkAppliedPendingConsumption { input_id: String },
ConsumeInput { input_id: String },
ConsumeOnAccept { input_id: String },
SupersedeInput { input_id: String, superseded_by: String },
CoalesceInput { input_id: String, aggregate_id: String },
AbandonInput {
input_id: String,
reason: Enum<InputAbandonReason>,
attempt_count: u64,
},
RecordBoundarySeq { input_id: String, seq: u64 },
RegisterOp { operation_id: String, kind: Enum<OperationKind> },
StartOp { operation_id: String },
CompleteOp { operation_id: String, outcome: Enum<OperationTerminalOutcomeKind>, payload: String },
FailOp { operation_id: String, outcome: Enum<OperationTerminalOutcomeKind>, payload: String },
CancelOp { operation_id: String, outcome: Enum<OperationTerminalOutcomeKind>, payload: String },
AbortOp { operation_id: String, outcome: Enum<OperationTerminalOutcomeKind>, payload: String },
PeerReadyOp { operation_id: String },
ProgressReportedOp { operation_id: String },
RetireRequestedOp { operation_id: String },
RetireCompletedOp { operation_id: String, outcome: Enum<OperationTerminalOutcomeKind>, payload: String },
TerminateOp { operation_id: String, outcome: Enum<OperationTerminalOutcomeKind>, payload: String },
RequestWaitAll { wait_request_id: WaitRequestId, operation_ids: Set<String>, operation_id_tokens: Set<OperationId> },
SatisfyWaitAll { wait_request_id: WaitRequestId, operation_id_tokens: Set<OperationId> },
CancelWaitAll,
SpawnDrain { mode: DrainMode },
StopDrain,
DrainExitedClean,
DrainExitedRespawnable,
StageVisibilityFilter { filter: ToolFilter },
CommitVisibilityFilter { filter: ToolFilter, revision: u64 },
StageDeferredNames { names: Set<String> },
CommitDeferredNames { authorities: Map<String, ToolVisibilityWitness> },
SyncVisibilityRevisions {
active_revision: u64,
staged_revision: u64,
active_deferred_names: Set<String>,
staged_deferred_names: Set<String>,
active_deferred_authorities: Map<String, ToolVisibilityWitness>,
staged_deferred_authorities: Map<String, ToolVisibilityWitness>,
},
SurfaceRegister { surface_id: String },
SurfaceStageAdd { surface_id: String, now_ms: u64 },
SurfaceStageRemove { surface_id: String, now_ms: u64 },
SurfaceStageReload { surface_id: String, now_ms: u64 },
SurfaceApplyBoundary {
surface_id: String,
now_ms: u64,
staged_intent_sequence: u64,
applied_at_turn: u64,
},
SurfaceMarkPendingSucceeded {
surface_id: String,
pending_task_sequence: u64,
staged_intent_sequence: u64,
},
SurfaceMarkPendingFailed {
surface_id: String,
pending_task_sequence: u64,
staged_intent_sequence: u64,
cause: Enum<ExternalToolSurfaceFailureCause>,
},
SurfaceCallStarted { surface_id: String },
SurfaceCallFinished { surface_id: String },
SurfaceFinalizeRemovalClean { surface_id: String },
SurfaceFinalizeRemovalForced { surface_id: String },
SurfaceSnapshotAligned { epoch: u64 },
SurfaceShutdown,
McpServerConnectPending { server_id: McpServerId },
McpServerConnected { server_id: McpServerId },
McpServerFailed { server_id: McpServerId, error: String },
McpServerDisconnected { server_id: McpServerId },
McpServerReload { server_id: McpServerId },
PeerRequestSent { corr_id: PeerCorrelationId, to: String },
PeerResponseProgressArrived { corr_id: PeerCorrelationId },
PeerResponseTerminalArrived { corr_id: PeerCorrelationId, disposition: PeerTerminalDisposition },
PeerRequestTimedOut { corr_id: PeerCorrelationId },
PeerRequestReceived { corr_id: PeerCorrelationId },
PeerResponseReplied { corr_id: PeerCorrelationId },
AdvanceSessionContext { updated_at_ms: u64 },
InteractionStreamReserved { corr_id: PeerCorrelationId },
InteractionStreamAttached { corr_id: PeerCorrelationId },
InteractionStreamCompleted { corr_id: PeerCorrelationId },
InteractionStreamExpired { corr_id: PeerCorrelationId },
InteractionStreamClosedEarly { corr_id: PeerCorrelationId },
AttachSessionIngress { comms_runtime_id: CommsRuntimeId },
AttachMobIngress { comms_runtime_id: CommsRuntimeId, mob_id: MobId },
DetachIngress,
BindSupervisor {
name: String,
peer_id: String,
address: String,
epoch: u64,
},
AuthorizeSupervisor {
name: String,
peer_id: String,
address: String,
epoch: u64,
},
RevokeSupervisor {
peer_id: String,
epoch: u64,
},
SupervisorTrustEdgePublished {
peer_id: String,
epoch: u64,
},
SupervisorTrustEdgePublishFailed {
peer_id: String,
epoch: u64,
reason: String,
},
SupervisorTrustEdgeRevoked {
peer_id: String,
epoch: u64,
},
SupervisorTrustEdgeRevokeFailed {
peer_id: String,
epoch: u64,
reason: String,
},
PublishLocalEndpoint {
endpoint: PeerEndpoint,
},
ClearLocalEndpoint,
AddDirectPeerEndpoint {
endpoint: PeerEndpoint,
},
RemoveDirectPeerEndpoint {
endpoint: PeerEndpoint,
},
ApplyMobPeerOverlay {
epoch: u64,
endpoints: Set<PeerEndpoint>,
},
}
surface_only [
ContainsSession,
SessionHasExecutor,
SessionHasComms,
OpsLifecycleRegistry,
InputState,
ListActiveInputs,
RuntimeState,
ModelRoutingStatus,
LoadBoundaryReceipt
]
signal MeerkatMachineSignal {
Initialize,
BoundaryApplied { revision: u64 },
DrainQueuedRun { run_id: RunId },
ClassifyExternalEnvelope {
item_id: String,
from_peer: String,
envelope_kind: Enum<PeerIngressEnvelopeClass>,
request_intent: String,
lifecycle_kind: Enum<PeerIngressLifecycleClass>,
lifecycle_peer_param: Option<String>,
response_status: Enum<PeerIngressResponseStatus>,
in_reply_to: String,
},
ClassifyPlainEvent { source_name: String },
EnsureDrainRunning,
}
effect MeerkatMachineEffect {
RuntimeBound { agent_runtime_id: AgentRuntimeId, fence_token: FenceToken },
RuntimeRetired { agent_runtime_id: AgentRuntimeId, fence_token: FenceToken },
RuntimeDestroyed { agent_runtime_id: AgentRuntimeId, fence_token: FenceToken },
TurnRunStarted { run_id: RunId },
TurnBoundaryApplied { run_id: RunId, boundary_sequence: u64 },
TurnRunCompleted { run_id: RunId, outcome: Enum<TurnTerminalOutcome> },
TurnRunFailed {
run_id: RunId,
terminal_cause_kind: Enum<TurnTerminalCauseKind>,
error: String
},
TurnRunCancelled { run_id: RunId, reason: Enum<TurnCancellationReason> },
TurnCheckCompaction,
RequestCancellationAtBoundary,
WakeInterrupt,
CommittedVisibleSetPublished { revision: u64 },
RuntimeNotice { kind: Enum<RuntimeNoticeKind>, detail: String },
RuntimeEffectFact { kind: Enum<RuntimeEffectKind>, reason: String },
ModelRoutingStatusChanged { topology_epoch: u64 },
SwitchTurnDenied { request_id: String, reason: Enum<RoutingDenialReason> },
SwitchTurnPersistentReconfigureRequested { request_id: String, target_model: String },
SwitchTurnFiniteOverrideActivated { request_id: String, target_model: String, turns_remaining: u64 },
SwitchTurnFiniteOverrideRestored { request_id: String },
ImageOperationPhaseChanged { operation_id: String, phase: Enum<RoutingImageOperationPhase> },
ImageOperationDenied { operation_id: String, reason: Enum<RoutingDenialReason> },
ModelRoutingApprovalTerminalized { approval_id: String, phase: Enum<RoutingApprovalPhase> },
ResolveAdmission,
SubmitAdmittedIngressEffect,
SubmitRunPrimitive,
ResolveCompletionAsTerminated,
ApplyControlPlaneCommand,
InitiateRecycle,
IngressAccepted,
PostAdmissionSignal { signal: Enum<PostAdmissionSignalKind> },
ReadyForRun,
InputLifecycleNotice,
CompletionResolved,
IngressNotice,
SilentIntentApplied,
CheckCompaction,
RecordTerminalOutcome,
RecordRunAssociation,
RecordBoundarySequence,
SubmitOpEvent { operation_id: String },
NotifyOpWatcher { operation_id: String },
ExposeOperationPeer { operation_id: String },
RetainTerminalRecord { operation_id: String },
EvictCompletedRecord { operation_id: String },
CompletionProduced { seq: u64, operation_id: OperationId, kind: OperationKind },
WaitAllSatisfied { wait_request_id: WaitRequestId, operation_ids: Set<OperationId> },
CollectCompletedResult,
EnqueueClassifiedEntry,
PeerIngressClassified {
class: Enum<PeerIngressInputClass>,
kind: Enum<PeerIngressAdmittedKind>,
auth: Enum<PeerIngressAuthClass>,
lifecycle_kind: Option<Enum<PeerIngressLifecycleClass>>,
lifecycle_peer: Option<String>,
request_id: Option<String>,
response_terminality: Option<Enum<PeerIngressResponseTerminality>>,
},
SpawnDrainTask,
ScheduleSurfaceCompletion {
surface_id: String,
operation: Enum<ExternalToolSurfaceDeltaOperation>,
pending_task_sequence: u64,
staged_intent_sequence: u64,
applied_at_turn: u64,
},
RefreshVisibleSurfaceSet { snapshot_epoch: u64 },
EmitExternalToolDelta {
surface_id: String,
operation: Enum<ExternalToolSurfaceDeltaOperation>,
phase: Enum<ExternalToolSurfaceDeltaPhase>,
cause: Option<Enum<ExternalToolSurfaceFailureCause>>,
},
CloseSurfaceConnection { surface_id: String },
RejectSurfaceCall { surface_id: String, cause: Enum<ExternalToolSurfaceFailureCause> },
PublishSupervisorTrustEdge {
peer_id: String,
name: String,
address: String,
signing_public_key: Option<String>,
epoch: u64,
},
RevokeSupervisorTrustEdge { peer_id: String, epoch: u64 },
McpServerStateChanged { server_id: McpServerId, new_state: McpServerState },
McpServerReloadRequested { server_id: McpServerId },
PeerInteractionStateChanged { corr_id: PeerCorrelationId, new_state: OutboundPeerRequestState },
PeerInteractionCleanup { corr_id: PeerCorrelationId },
InboundPeerInteractionStateChanged { corr_id: PeerCorrelationId, new_state: InboundPeerRequestState },
SessionContextAdvanced { updated_at_ms: u64 },
InteractionStreamStateChanged { corr_id: PeerCorrelationId, new_state: InteractionStreamState },
InteractionStreamCleanup { corr_id: PeerCorrelationId },
LocalEndpointChanged { endpoint: Option<PeerEndpoint> },
PeerProjectionChanged { peer_projection_epoch: u64 },
CommsTrustReconcileRequested { peer_projection_epoch: u64 },
}
disposition RuntimeBound => routed [MobMachine],
disposition RuntimeRetired => routed [MobMachine],
disposition RuntimeDestroyed => routed [MobMachine],
disposition TurnRunStarted => local,
disposition TurnBoundaryApplied => local,
disposition TurnRunCompleted => local,
disposition TurnRunFailed => local,
disposition TurnRunCancelled => local,
disposition TurnCheckCompaction => local,
disposition RequestCancellationAtBoundary => local,
disposition WakeInterrupt => local,
disposition CommittedVisibleSetPublished => external,
disposition RuntimeNotice => external,
disposition RuntimeEffectFact => local,
disposition ModelRoutingStatusChanged => external,
disposition SwitchTurnDenied => external,
disposition SwitchTurnPersistentReconfigureRequested => local,
disposition SwitchTurnFiniteOverrideActivated => local,
disposition SwitchTurnFiniteOverrideRestored => local,
disposition ImageOperationPhaseChanged => external,
disposition ImageOperationDenied => external,
disposition ModelRoutingApprovalTerminalized => external,
disposition ResolveAdmission => local,
disposition SubmitAdmittedIngressEffect => local,
disposition SubmitRunPrimitive => local,
disposition ResolveCompletionAsTerminated => local,
disposition ApplyControlPlaneCommand => local,
disposition InitiateRecycle => local,
disposition IngressAccepted => external,
disposition PostAdmissionSignal => local,
disposition ReadyForRun => local,
disposition InputLifecycleNotice => external,
disposition CompletionResolved => local,
disposition IngressNotice => external,
disposition SilentIntentApplied => external,
disposition CheckCompaction => local,
disposition RecordTerminalOutcome => local,
disposition RecordRunAssociation => local,
disposition RecordBoundarySequence => local,
disposition SubmitOpEvent => local,
disposition NotifyOpWatcher => local,
disposition ExposeOperationPeer => local,
disposition RetainTerminalRecord => local,
disposition EvictCompletedRecord => local,
disposition CompletionProduced => local,
disposition WaitAllSatisfied => external handoff ops_barrier_satisfaction,
disposition CollectCompletedResult => local,
disposition EnqueueClassifiedEntry => local,
disposition PeerIngressClassified => local,
disposition SpawnDrainTask => local,
disposition ScheduleSurfaceCompletion => external handoff surface_completion,
disposition RefreshVisibleSurfaceSet => external handoff surface_snapshot_alignment,
disposition EmitExternalToolDelta => external,
disposition CloseSurfaceConnection => local,
disposition RejectSurfaceCall => external,
disposition PublishSupervisorTrustEdge => external handoff supervisor_trust_publish,
disposition RevokeSupervisorTrustEdge => external handoff supervisor_trust_revoke,
disposition McpServerStateChanged => external,
disposition McpServerReloadRequested => external,
disposition PeerInteractionStateChanged => external,
disposition PeerInteractionCleanup => external,
disposition InboundPeerInteractionStateChanged => external,
disposition SessionContextAdvanced => external,
disposition InteractionStreamStateChanged => external,
disposition InteractionStreamCleanup => external,
disposition LocalEndpointChanged => external,
disposition PeerProjectionChanged => external,
disposition CommsTrustReconcileRequested => external,
helper deferred_authority_has_identity(witness: ToolVisibilityWitness) -> bool {
witness.len() > 0
}
helper deferred_authorities_have_identity(
names: Set<String>,
witnesses: Map<String, ToolVisibilityWitness>
) -> bool {
for_all(requested_name in names,
deferred_authority_has_identity(witnesses.get_cloned(requested_name).get("value")))
}
invariant fence_requires_bound_runtime {
self.active_fence_token == None || self.active_runtime_id != None
}
invariant running_has_current_run {
self.lifecycle_phase != Phase::Running || self.current_run_id != None
}
invariant current_run_only_while_running_or_retired {
self.current_run_id == None
|| self.lifecycle_phase == Phase::Running
|| self.lifecycle_phase == Phase::Retired
}
invariant staged_surface_ops_are_known_and_sequenced {
for_all(surface_id in self.surface_staged_op.keys(),
self.known_surfaces.contains(surface_id)
&& self.surface_staged_intent_sequence.contains_key(surface_id))
}
invariant staged_reload_surfaces_are_active {
for_all(surface_id in self.reload_staged_surfaces,
self.active_surfaces.contains(surface_id))
}
invariant peer_ingress_owner_consistency {
(self.peer_ingress_owner_kind == PeerIngressOwnerKind::Unattached
&& self.peer_ingress_comms_runtime_id == None
&& self.peer_ingress_mob_id == None)
|| (self.peer_ingress_owner_kind == PeerIngressOwnerKind::SessionOwned
&& self.peer_ingress_comms_runtime_id != None
&& self.peer_ingress_mob_id == None)
|| (self.peer_ingress_owner_kind == PeerIngressOwnerKind::MobOwned
&& self.peer_ingress_comms_runtime_id != None
&& self.peer_ingress_mob_id != None)
}
invariant supervisor_binding_consistency {
(self.supervisor_binding_kind == SupervisorBindingKind::Unbound
&& self.supervisor_bound_name == None
&& self.supervisor_bound_peer_id == None
&& self.supervisor_bound_address == None
&& self.supervisor_bound_epoch == None)
|| (self.supervisor_binding_kind == SupervisorBindingKind::Bound
&& self.supervisor_bound_name != None
&& self.supervisor_bound_peer_id != None
&& self.supervisor_bound_address != None
&& self.supervisor_bound_epoch != None)
}
transition Initialize {
on signal Initialize
guard { self.lifecycle_phase == Phase::Initializing }
update {}
to Idle
}
transition RegisterSession {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input RegisterSession { session_id }
update {
self.session_id = Some(session_id);
}
to Idle
}
transition UnregisterSessionIdle {
on input UnregisterSession { session_id }
guard { self.lifecycle_phase == Phase::Idle }
guard "session_matches_current" { self.session_id == Some(session_id) }
update {
self.session_id = None;
self.active_runtime_id = None;
self.active_fence_token = None;
self.current_run_id = None;
self.pre_run_phase = None;
self.registration_phase = RegistrationPhase::Queuing;
}
to Idle
}
transition UnregisterSessionAttached {
on input UnregisterSession { session_id }
guard { self.lifecycle_phase == Phase::Attached }
guard "session_matches_current" { self.session_id == Some(session_id) }
update {
self.session_id = None;
self.active_runtime_id = None;
self.active_fence_token = None;
self.current_run_id = None;
self.pre_run_phase = None;
self.registration_phase = RegistrationPhase::Queuing;
}
to Idle
}
transition UnregisterSessionRunning {
on input UnregisterSession { session_id }
guard { self.lifecycle_phase == Phase::Running }
guard "session_matches_current" { self.session_id == Some(session_id) }
update {
self.session_id = None;
self.active_runtime_id = None;
self.active_fence_token = None;
self.current_run_id = None;
self.pre_run_phase = None;
self.registration_phase = RegistrationPhase::Queuing;
}
to Idle
}
transition UnregisterSessionRetired {
on input UnregisterSession { session_id }
guard { self.lifecycle_phase == Phase::Retired }
guard "session_matches_current" { self.session_id == Some(session_id) }
update {
self.session_id = None;
self.active_runtime_id = None;
self.active_fence_token = None;
self.current_run_id = None;
self.pre_run_phase = None;
self.registration_phase = RegistrationPhase::Queuing;
}
to Idle
}
transition UnregisterSessionStopped {
on input UnregisterSession { session_id }
guard { self.lifecycle_phase == Phase::Stopped }
guard "session_matches_current" { self.session_id == Some(session_id) }
update {
self.session_id = None;
self.active_runtime_id = None;
self.active_fence_token = None;
self.current_run_id = None;
self.pre_run_phase = None;
self.registration_phase = RegistrationPhase::Queuing;
}
to Idle
}
transition ReconfigureSessionLlmIdentityAttached {
on input ReconfigureSessionLlmIdentity {
previous_identity, previous_visibility_state,
previous_capability_surface, previous_capability_surface_status,
target_identity, target_capability_surface,
next_visibility_state, next_capability_base_filter,
next_active_visibility_revision, tool_visibility_delta
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "runtime_is_bound" { self.active_runtime_id != None }
update {}
to Attached
}
transition ReconfigureSessionLlmIdentityRunning {
on input ReconfigureSessionLlmIdentity {
previous_identity, previous_visibility_state,
previous_capability_surface, previous_capability_surface_status,
target_identity, target_capability_surface,
next_visibility_state, next_capability_base_filter,
next_active_visibility_revision, tool_visibility_delta
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "runtime_is_bound" { self.active_runtime_id != None }
update {}
to Running
}
transition SetModelRoutingBaseline {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input SetModelRoutingBaseline { baseline_model, realtime_capable }
guard "session_registered" { self.session_id != None }
update {
self.model_routing_baseline_model = Some(baseline_model);
self.model_routing_baseline_realtime = Some(realtime_capable);
self.model_routing_topology_epoch = self.model_routing_topology_epoch + 1;
}
to Idle
emit ModelRoutingStatusChanged { topology_epoch: self.model_routing_topology_epoch }
}
transition RequestFiniteSwitchTurnApprovalUnavailable {
per_phase [Idle, Attached, Running]
on input RequestFiniteSwitchTurn {
request_id, target_model, turns, target_realtime_capable,
requires_approval, approval_available, approval_denied,
realtime_detach_allowed
}
guard "baseline_known" { self.model_routing_baseline_model != None }
guard "approval_unavailable" { requires_approval && !approval_available }
update {
self.model_routing_switch_terminal.insert(request_id, RoutingSwitchTurnTerminal::Denied);
self.model_routing_switch_denials.insert(request_id, RoutingDenialReason::ApprovalRequiredButUnavailable);
}
to Idle
emit SwitchTurnDenied { request_id: request_id, reason: RoutingDenialReason::ApprovalRequiredButUnavailable }
}
transition RequestFiniteSwitchTurnApprovalDenied {
per_phase [Idle, Attached, Running]
on input RequestFiniteSwitchTurn {
request_id, target_model, turns, target_realtime_capable,
requires_approval, approval_available, approval_denied,
realtime_detach_allowed
}
guard "approval_denied" { requires_approval && approval_available && approval_denied }
update {
self.model_routing_approval_phases.insert(request_id, RoutingApprovalPhase::Denied);
self.model_routing_approval_parent_kind.insert(request_id, RoutingApprovalParentKind::SwitchTurn);
self.model_routing_switch_terminal.insert(request_id, RoutingSwitchTurnTerminal::Denied);
self.model_routing_switch_denials.insert(request_id, RoutingDenialReason::DeniedDuringApproval);
}
to Idle
emit SwitchTurnDenied { request_id: request_id, reason: RoutingDenialReason::DeniedDuringApproval }
emit ModelRoutingApprovalTerminalized { approval_id: request_id, phase: RoutingApprovalPhase::Denied }
}
transition RequestFiniteSwitchTurnScopedConflict {
per_phase [Idle, Attached, Running]
on input RequestFiniteSwitchTurn {
request_id, target_model, turns, target_realtime_capable,
requires_approval, approval_available, approval_denied,
realtime_detach_allowed
}
guard "scoped_conflict" {
self.model_routing_turn_override_id != None
|| self.model_routing_operation_override_id != None
|| self.model_routing_pending_switch_request_id != None
}
update {
self.model_routing_switch_terminal.insert(request_id, RoutingSwitchTurnTerminal::Denied);
self.model_routing_switch_denials.insert(request_id, RoutingDenialReason::ScopedOverrideConflict);
}
to Idle
emit SwitchTurnDenied { request_id: request_id, reason: RoutingDenialReason::ScopedOverrideConflict }
}
transition RequestFiniteSwitchTurnAccepted {
per_phase [Idle, Attached, Running]
on input RequestFiniteSwitchTurn {
request_id, target_model, turns, target_realtime_capable,
requires_approval, approval_available, approval_denied,
realtime_detach_allowed
}
guard "baseline_known" { self.model_routing_baseline_model != None }
guard "positive_turns" { turns > 0 }
guard "approval_satisfied" { !requires_approval || (approval_available && !approval_denied) }
guard "no_scoped_conflict" {
self.model_routing_turn_override_id == None
&& self.model_routing_operation_override_id == None
&& self.model_routing_pending_switch_request_id == None
}
update {
if requires_approval {
self.model_routing_approval_phases.insert(request_id, RoutingApprovalPhase::Approved);
self.model_routing_approval_parent_kind.insert(request_id, RoutingApprovalParentKind::SwitchTurn);
}
self.model_routing_pending_switch_request_id = Some(request_id);
self.model_routing_pending_switch_target_model = Some(target_model);
self.model_routing_pending_switch_realtime = Some(target_realtime_capable);
self.model_routing_pending_switch_turns = Some(turns);
self.model_routing_pending_switch_phase = Some(RoutingSwitchTurnPhase::PendingForBoundary);
}
to Idle
}
transition RequestUntilChangedSwitchTurnAccepted {
per_phase [Idle, Attached, Running]
on input RequestUntilChangedSwitchTurn {
request_id, target_model, target_realtime_capable,
requires_approval, approval_available, approval_denied,
realtime_detach_allowed
}
guard "baseline_known" { self.model_routing_baseline_model != None }
guard "approval_satisfied" { !requires_approval || (approval_available && !approval_denied) }
update {
if requires_approval {
self.model_routing_approval_phases.insert(request_id, RoutingApprovalPhase::Approved);
self.model_routing_approval_parent_kind.insert(request_id, RoutingApprovalParentKind::SwitchTurn);
}
self.model_routing_pending_switch_request_id = Some(request_id);
self.model_routing_pending_switch_target_model = Some(target_model);
self.model_routing_pending_switch_realtime = Some(target_realtime_capable);
self.model_routing_pending_switch_turns = None;
self.model_routing_pending_switch_phase = Some(RoutingSwitchTurnPhase::ApplyingPersistentReconfigure);
}
to Idle
emit SwitchTurnPersistentReconfigureRequested { request_id: request_id, target_model: target_model }
}
transition RequestUntilChangedSwitchTurnApprovalUnavailable {
per_phase [Idle, Attached, Running]
on input RequestUntilChangedSwitchTurn {
request_id, target_model, target_realtime_capable,
requires_approval, approval_available, approval_denied,
realtime_detach_allowed
}
guard "baseline_known" { self.model_routing_baseline_model != None }
guard "approval_unavailable" { requires_approval && !approval_available }
update {
self.model_routing_switch_terminal.insert(request_id, RoutingSwitchTurnTerminal::Denied);
self.model_routing_switch_denials.insert(request_id, RoutingDenialReason::ApprovalRequiredButUnavailable);
}
to Idle
emit SwitchTurnDenied { request_id: request_id, reason: RoutingDenialReason::ApprovalRequiredButUnavailable }
}
transition RequestUntilChangedSwitchTurnApprovalDenied {
per_phase [Idle, Attached, Running]
on input RequestUntilChangedSwitchTurn {
request_id, target_model, target_realtime_capable,
requires_approval, approval_available, approval_denied,
realtime_detach_allowed
}
guard "approval_denied" { requires_approval && approval_available && approval_denied }
update {
self.model_routing_approval_phases.insert(request_id, RoutingApprovalPhase::Denied);
self.model_routing_approval_parent_kind.insert(request_id, RoutingApprovalParentKind::SwitchTurn);
self.model_routing_switch_terminal.insert(request_id, RoutingSwitchTurnTerminal::Denied);
self.model_routing_switch_denials.insert(request_id, RoutingDenialReason::DeniedDuringApproval);
}
to Idle
emit SwitchTurnDenied { request_id: request_id, reason: RoutingDenialReason::DeniedDuringApproval }
emit ModelRoutingApprovalTerminalized { approval_id: request_id, phase: RoutingApprovalPhase::Denied }
}
transition CompleteUntilChangedSwitchTurnReconfigure {
per_phase [Idle, Attached, Running]
on input CompleteUntilChangedSwitchTurnReconfigure { request_id }
guard "pending_until_changed_reconfigure" {
self.model_routing_pending_switch_request_id == Some(request_id)
&& self.model_routing_pending_switch_turns == None
&& self.model_routing_pending_switch_phase == Some(RoutingSwitchTurnPhase::ApplyingPersistentReconfigure)
}
update {
self.model_routing_switch_terminal.insert(request_id, RoutingSwitchTurnTerminal::PersistentReconfigureApplied);
self.model_routing_pending_switch_request_id = None;
self.model_routing_pending_switch_target_model = None;
self.model_routing_pending_switch_realtime = None;
self.model_routing_pending_switch_phase = None;
}
to Idle
emit ModelRoutingStatusChanged { topology_epoch: self.model_routing_topology_epoch }
}
transition AdmitPendingFiniteSwitchTurn {
per_phase [Idle, Attached, Running]
on input AdmitModelRoutingAssistantTurn
guard "pending_finite" {
self.model_routing_pending_switch_request_id != None
&& self.model_routing_pending_switch_turns != None
}
update {
self.model_routing_turn_override_id = Some(self.model_routing_pending_switch_request_id.get("value"));
self.model_routing_turn_request_id = Some(self.model_routing_pending_switch_request_id.get("value"));
self.model_routing_turn_target_model = Some(self.model_routing_pending_switch_target_model.get("value"));
self.model_routing_turn_realtime = Some(self.model_routing_pending_switch_realtime.get("value"));
self.model_routing_turn_remaining_turns = Some(self.model_routing_pending_switch_turns.get("value"));
self.model_routing_pending_switch_request_id = None;
self.model_routing_pending_switch_target_model = None;
self.model_routing_pending_switch_realtime = None;
self.model_routing_pending_switch_turns = None;
self.model_routing_pending_switch_phase = None;
self.model_routing_topology_epoch = self.model_routing_topology_epoch + 1;
}
to Idle
emit SwitchTurnFiniteOverrideActivated {
request_id: self.model_routing_turn_request_id.get("value"),
target_model: self.model_routing_turn_target_model.get("value"),
turns_remaining: self.model_routing_turn_remaining_turns.get("value")
}
emit ModelRoutingStatusChanged { topology_epoch: self.model_routing_topology_epoch }
}
transition DecrementFiniteSwitchTurn {
per_phase [Idle, Attached, Running]
on input AdmitModelRoutingAssistantTurn
guard "active_multi_turn" {
self.model_routing_turn_override_id != None
&& self.model_routing_turn_remaining_turns.get("value") > 1
}
update {
self.model_routing_turn_remaining_turns = Some(self.model_routing_turn_remaining_turns.get("value") - 1);
}
to Idle
}
transition RestoreConsumedFiniteSwitchTurn {
per_phase [Idle, Attached, Running]
on input AdmitModelRoutingAssistantTurn
guard "active_one_turn_remaining" {
self.model_routing_turn_override_id != None
&& self.model_routing_turn_remaining_turns.get("value") == 1
}
update {
self.model_routing_switch_terminal.insert(self.model_routing_turn_request_id.get("value"), RoutingSwitchTurnTerminal::ConsumedAndRestored);
self.model_routing_turn_override_id = None;
self.model_routing_turn_request_id = None;
self.model_routing_turn_target_model = None;
self.model_routing_turn_realtime = None;
self.model_routing_turn_remaining_turns = None;
self.model_routing_topology_epoch = self.model_routing_topology_epoch + 1;
}
to Idle
emit SwitchTurnFiniteOverrideRestored { request_id: self.model_routing_turn_request_id.get("value") }
emit ModelRoutingStatusChanged { topology_epoch: self.model_routing_topology_epoch }
}
transition BeginImageOperationScopedConflict {
per_phase [Idle, Attached, Running]
on input BeginImageOperation {
operation_id, target_model, target_realtime_capable,
requires_approval, approval_available, approval_denied,
realtime_detach_allowed, requires_scoped_override
}
guard "operation_in_operation_conflict" { self.model_routing_operation_override_id != None }
update {
self.model_routing_image_operation_phases.insert(operation_id, RoutingImageOperationPhase::Terminal);
self.model_routing_image_terminals.insert(operation_id, RoutingImageTerminal::Denied);
self.model_routing_image_denials.insert(operation_id, RoutingDenialReason::ScopedOverrideConflict);
}
to Idle
emit ImageOperationDenied { operation_id: operation_id, reason: RoutingDenialReason::ScopedOverrideConflict }
}
transition BeginImageOperationApprovalUnavailable {
per_phase [Idle, Attached, Running]
on input BeginImageOperation {
operation_id, target_model, target_realtime_capable,
requires_approval, approval_available, approval_denied,
realtime_detach_allowed, requires_scoped_override
}
guard "approval_unavailable" { requires_approval && !approval_available }
update {
self.model_routing_image_operation_phases.insert(operation_id, RoutingImageOperationPhase::Terminal);
self.model_routing_image_terminals.insert(operation_id, RoutingImageTerminal::Denied);
self.model_routing_image_denials.insert(operation_id, RoutingDenialReason::ApprovalRequiredButUnavailable);
}
to Idle
emit ImageOperationDenied { operation_id: operation_id, reason: RoutingDenialReason::ApprovalRequiredButUnavailable }
}
transition BeginImageOperationApprovalDenied {
per_phase [Idle, Attached, Running]
on input BeginImageOperation {
operation_id, target_model, target_realtime_capable,
requires_approval, approval_available, approval_denied,
realtime_detach_allowed, requires_scoped_override
}
guard "approval_denied" { requires_approval && approval_available && approval_denied }
update {
self.model_routing_approval_phases.insert(operation_id, RoutingApprovalPhase::Denied);
self.model_routing_approval_parent_kind.insert(operation_id, RoutingApprovalParentKind::ImageOperation);
self.model_routing_image_operation_phases.insert(operation_id, RoutingImageOperationPhase::Terminal);
self.model_routing_image_terminals.insert(operation_id, RoutingImageTerminal::Denied);
self.model_routing_image_denials.insert(operation_id, RoutingDenialReason::DeniedDuringApproval);
}
to Idle
emit ImageOperationDenied { operation_id: operation_id, reason: RoutingDenialReason::DeniedDuringApproval }
emit ModelRoutingApprovalTerminalized { approval_id: operation_id, phase: RoutingApprovalPhase::Denied }
}
transition BeginImageOperationAccepted {
per_phase [Idle, Attached, Running]
on input BeginImageOperation {
operation_id, target_model, target_realtime_capable,
requires_approval, approval_available, approval_denied,
realtime_detach_allowed, requires_scoped_override
}
guard "baseline_known" { self.model_routing_baseline_model != None }
guard "no_operation_in_operation" { self.model_routing_operation_override_id == None }
guard "approval_satisfied" { !requires_approval || (approval_available && !approval_denied) }
update {
if requires_approval {
self.model_routing_approval_phases.insert(operation_id, RoutingApprovalPhase::Approved);
self.model_routing_approval_parent_kind.insert(operation_id, RoutingApprovalParentKind::ImageOperation);
}
self.model_routing_image_operation_phases.insert(operation_id, RoutingImageOperationPhase::PlanResolved);
self.model_routing_image_operation_target_models.insert(operation_id, target_model);
self.model_routing_image_operation_realtime.insert(operation_id, target_realtime_capable);
if requires_scoped_override {
self.model_routing_image_operation_requires_scoped_override.insert(operation_id, true);
}
}
to Idle
emit ImageOperationPhaseChanged { operation_id: operation_id, phase: RoutingImageOperationPhase::PlanResolved }
}
transition ActivateImageOperationOverride {
per_phase [Idle, Attached, Running]
on input ActivateImageOperationOverride { operation_id, target_model, target_realtime_capable }
guard "operation_plan_resolved" { self.model_routing_image_operation_target_models.contains_key(operation_id) }
guard "operation_requires_scoped_override" {
self.model_routing_image_operation_requires_scoped_override.contains_key(operation_id)
}
guard "no_operation_override_active" { self.model_routing_operation_override_id == None }
update {
self.model_routing_operation_override_id = Some(operation_id);
self.model_routing_operation_target_model = Some(target_model);
self.model_routing_operation_realtime = Some(target_realtime_capable);
self.model_routing_image_operation_phases.insert(operation_id, RoutingImageOperationPhase::ScopedOverrideActive);
self.model_routing_topology_epoch = self.model_routing_topology_epoch + 1;
}
to Idle
emit ImageOperationPhaseChanged { operation_id: operation_id, phase: RoutingImageOperationPhase::ScopedOverrideActive }
emit ModelRoutingStatusChanged { topology_epoch: self.model_routing_topology_epoch }
}
transition CompleteImageOperation {
per_phase [Idle, Attached, Running]
on input CompleteImageOperation { operation_id, terminal, terminal_payload }
guard "operation_active" { self.model_routing_operation_override_id == Some(operation_id) }
guard "operation_requires_scoped_override" {
self.model_routing_image_operation_requires_scoped_override.contains_key(operation_id)
}
update {
self.model_routing_image_operation_phases.insert(operation_id, RoutingImageOperationPhase::RestoringScopedOverride);
self.model_routing_image_terminals.insert(operation_id, terminal);
self.model_routing_image_terminal_payloads.insert(operation_id, terminal_payload);
}
to Idle
emit ImageOperationPhaseChanged { operation_id: operation_id, phase: RoutingImageOperationPhase::RestoringScopedOverride }
}
transition CompleteImageOperationWithoutScopedOverride {
per_phase [Idle, Attached, Running]
on input CompleteImageOperation { operation_id, terminal, terminal_payload }
guard "operation_plan_resolved" { self.model_routing_image_operation_target_models.contains_key(operation_id) }
guard "operation_does_not_require_scoped_override" {
!self.model_routing_image_operation_requires_scoped_override.contains_key(operation_id)
}
guard "no_operation_override_active" { self.model_routing_operation_override_id == None }
update {
self.model_routing_image_operation_phases.insert(operation_id, RoutingImageOperationPhase::Terminal);
self.model_routing_image_terminals.insert(operation_id, terminal);
self.model_routing_image_terminal_payloads.insert(operation_id, terminal_payload);
self.model_routing_image_operation_target_models.remove(operation_id);
self.model_routing_image_operation_realtime.remove(operation_id);
self.model_routing_image_operation_requires_scoped_override.remove(operation_id);
}
to Idle
emit ImageOperationPhaseChanged { operation_id: operation_id, phase: RoutingImageOperationPhase::Terminal }
}
transition RestoreImageOperationOverride {
per_phase [Idle, Attached, Running]
on input RestoreImageOperationOverride { operation_id }
guard "operation_active" { self.model_routing_operation_override_id == Some(operation_id) }
update {
self.model_routing_operation_override_id = None;
self.model_routing_operation_target_model = None;
self.model_routing_operation_realtime = None;
self.model_routing_image_operation_phases.insert(operation_id, RoutingImageOperationPhase::Terminal);
self.model_routing_image_operation_target_models.remove(operation_id);
self.model_routing_image_operation_realtime.remove(operation_id);
self.model_routing_image_operation_requires_scoped_override.remove(operation_id);
self.model_routing_topology_epoch = self.model_routing_topology_epoch + 1;
}
to Idle
emit ImageOperationPhaseChanged { operation_id: operation_id, phase: RoutingImageOperationPhase::Terminal }
emit ModelRoutingStatusChanged { topology_epoch: self.model_routing_topology_epoch }
}
transition StagePersistentFilter {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input StagePersistentFilter { filter, witnesses }
guard "session_registered" { self.session_id != None }
update {}
to Idle
}
transition RequestDeferredTools {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input RequestDeferredTools { authorities }
guard "session_registered" { self.session_id != None }
guard "deferred_authorities_non_empty" { authorities != EmptyMap }
guard "deferred_authorities_have_identity" {
deferred_authorities_have_identity(authorities.keys(), authorities)
}
update {
self.next_staged_visibility_revision = self.next_staged_visibility_revision + 1;
self.staged_deferred_names = authorities.keys();
self.staged_deferred_authorities = authorities;
self.staged_visibility_revision = self.next_staged_visibility_revision;
}
to Idle
}
transition PrepareBindingsInitializing {
on input PrepareBindings { agent_runtime_id, fence_token, generation, session_id }
guard { self.lifecycle_phase == Phase::Initializing }
update {
self.active_runtime_id = Some(agent_runtime_id);
self.active_fence_token = Some(fence_token);
}
to Initializing
emit RuntimeBound { agent_runtime_id: self.active_runtime_id.get("value"), fence_token: self.active_fence_token.get("value") }
}
transition PrepareBindingsIdle {
on input PrepareBindings { agent_runtime_id, fence_token, generation, session_id }
guard { self.lifecycle_phase == Phase::Idle }
update {
self.active_runtime_id = Some(agent_runtime_id);
self.active_fence_token = Some(fence_token);
}
to Attached
emit RuntimeBound { agent_runtime_id: self.active_runtime_id.get("value"), fence_token: self.active_fence_token.get("value") }
}
transition PrepareBindingsAttached {
on input PrepareBindings { agent_runtime_id, fence_token, generation, session_id }
guard { self.lifecycle_phase == Phase::Attached }
update {
self.active_runtime_id = Some(agent_runtime_id);
self.active_fence_token = Some(fence_token);
}
to Attached
emit RuntimeBound { agent_runtime_id: self.active_runtime_id.get("value"), fence_token: self.active_fence_token.get("value") }
}
transition PrepareBindingsRunning {
on input PrepareBindings { agent_runtime_id, fence_token, generation, session_id }
guard { self.lifecycle_phase == Phase::Running }
update {
self.active_runtime_id = Some(agent_runtime_id);
self.active_fence_token = Some(fence_token);
}
to Running
emit RuntimeBound { agent_runtime_id: self.active_runtime_id.get("value"), fence_token: self.active_fence_token.get("value") }
}
transition PrepareBindingsRetired {
on input PrepareBindings { agent_runtime_id, fence_token, generation, session_id }
guard { self.lifecycle_phase == Phase::Retired }
update {
self.active_runtime_id = Some(agent_runtime_id);
self.active_fence_token = Some(fence_token);
}
to Retired
emit RuntimeBound { agent_runtime_id: self.active_runtime_id.get("value"), fence_token: self.active_fence_token.get("value") }
}
transition PrepareBindingsStopped {
on input PrepareBindings { agent_runtime_id, fence_token, generation, session_id }
guard { self.lifecycle_phase == Phase::Stopped }
update {
self.active_runtime_id = Some(agent_runtime_id);
self.active_fence_token = Some(fence_token);
}
to Stopped
emit RuntimeBound { agent_runtime_id: self.active_runtime_id.get("value"), fence_token: self.active_fence_token.get("value") }
}
transition SetPeerIngressContext {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input SetPeerIngressContext { keep_alive }
guard "session_registered" { self.session_id != None }
update {}
to Idle
}
transition NotifyDrainExited {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input NotifyDrainExited { reason }
guard "session_registered" { self.session_id != None }
update {}
to Idle
emit RuntimeNotice { kind: RuntimeNoticeKind::Drain, detail: "drain exited" }
}
transition InterruptCurrentRunAttached {
on input InterruptCurrentRun
guard { self.lifecycle_phase == Phase::Attached }
update {}
to Attached
emit WakeInterrupt
emit RequestCancellationAtBoundary
}
transition InterruptCurrentRun {
on input InterruptCurrentRun
guard { self.lifecycle_phase == Phase::Running }
update {}
to Running
emit WakeInterrupt
emit RequestCancellationAtBoundary
}
transition CancelAfterBoundaryAttached {
on input CancelAfterBoundary { reason }
guard { self.lifecycle_phase == Phase::Attached }
update {}
to Attached
emit RequestCancellationAtBoundary
emit RuntimeEffectFact { kind: RuntimeEffectKind::CancelAfterBoundary, reason: reason }
}
transition CancelAfterBoundary {
on input CancelAfterBoundary { reason }
guard { self.lifecycle_phase == Phase::Running }
update {}
to Running
emit RequestCancellationAtBoundary
emit RuntimeEffectFact { kind: RuntimeEffectKind::CancelAfterBoundary, reason: reason }
}
transition BoundaryAppliedPublish {
on signal BoundaryApplied { revision }
guard { self.lifecycle_phase == Phase::Running }
update {}
to Running
emit CommittedVisibleSetPublished { revision: revision }
}
transition PublishCommittedVisibleSetIdle {
on input PublishCommittedVisibleSet {
active_filter, staged_filter,
active_requested_deferred_names, staged_requested_deferred_names,
active_deferred_authorities, staged_deferred_authorities,
active_visibility_revision, staged_visibility_revision
}
guard { self.lifecycle_phase == Phase::Idle }
guard "session_registered" { self.session_id != None }
guard "active_not_behind_staged" { active_visibility_revision >= staged_visibility_revision }
guard "equal_revision_requires_equal_active_and_staged_input" {
active_visibility_revision != staged_visibility_revision
|| (active_filter == staged_filter
&& active_requested_deferred_names == staged_requested_deferred_names
&& active_deferred_authorities == staged_deferred_authorities)
}
guard "active_requested_subset_of_staged_requested" {
for_all(requested_name in active_requested_deferred_names, staged_requested_deferred_names.contains(requested_name))
}
guard "active_deferred_authorities_cover_names" {
for_all(requested_name in active_requested_deferred_names, active_deferred_authorities.contains_key(requested_name))
}
guard "staged_deferred_authorities_cover_names" {
for_all(requested_name in staged_requested_deferred_names, staged_deferred_authorities.contains_key(requested_name))
}
guard "active_deferred_authorities_are_name_scoped" {
for_all(witnessed_name in active_deferred_authorities.keys(), active_requested_deferred_names.contains(witnessed_name))
}
guard "staged_deferred_authorities_are_name_scoped" {
for_all(witnessed_name in staged_deferred_authorities.keys(), staged_requested_deferred_names.contains(witnessed_name))
}
guard "active_deferred_authorities_have_identity" {
deferred_authorities_have_identity(active_requested_deferred_names, active_deferred_authorities)
}
guard "staged_deferred_authorities_have_identity" {
deferred_authorities_have_identity(staged_requested_deferred_names, staged_deferred_authorities)
}
update {
self.active_filter = active_filter;
self.staged_filter = staged_filter;
self.active_deferred_names = active_requested_deferred_names;
self.staged_deferred_names = staged_requested_deferred_names;
self.active_deferred_authorities = active_deferred_authorities;
self.staged_deferred_authorities = staged_deferred_authorities;
self.active_visibility_revision = active_visibility_revision;
self.staged_visibility_revision = staged_visibility_revision;
if active_visibility_revision > self.next_staged_visibility_revision {
self.next_staged_visibility_revision = active_visibility_revision;
}
}
to Idle
emit CommittedVisibleSetPublished { revision: active_visibility_revision }
}
transition PublishCommittedVisibleSetAttached {
on input PublishCommittedVisibleSet {
active_filter, staged_filter,
active_requested_deferred_names, staged_requested_deferred_names,
active_deferred_authorities, staged_deferred_authorities,
active_visibility_revision, staged_visibility_revision
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "active_not_behind_staged" { active_visibility_revision >= staged_visibility_revision }
guard "equal_revision_requires_equal_active_and_staged_input" {
active_visibility_revision != staged_visibility_revision
|| (active_filter == staged_filter
&& active_requested_deferred_names == staged_requested_deferred_names
&& active_deferred_authorities == staged_deferred_authorities)
}
guard "active_requested_subset_of_staged_requested" {
for_all(requested_name in active_requested_deferred_names, staged_requested_deferred_names.contains(requested_name))
}
guard "active_deferred_authorities_cover_names" {
for_all(requested_name in active_requested_deferred_names, active_deferred_authorities.contains_key(requested_name))
}
guard "staged_deferred_authorities_cover_names" {
for_all(requested_name in staged_requested_deferred_names, staged_deferred_authorities.contains_key(requested_name))
}
guard "active_deferred_authorities_are_name_scoped" {
for_all(witnessed_name in active_deferred_authorities.keys(), active_requested_deferred_names.contains(witnessed_name))
}
guard "staged_deferred_authorities_are_name_scoped" {
for_all(witnessed_name in staged_deferred_authorities.keys(), staged_requested_deferred_names.contains(witnessed_name))
}
guard "active_deferred_authorities_have_identity" {
deferred_authorities_have_identity(active_requested_deferred_names, active_deferred_authorities)
}
guard "staged_deferred_authorities_have_identity" {
deferred_authorities_have_identity(staged_requested_deferred_names, staged_deferred_authorities)
}
update {
self.active_filter = active_filter;
self.staged_filter = staged_filter;
self.active_deferred_names = active_requested_deferred_names;
self.staged_deferred_names = staged_requested_deferred_names;
self.active_deferred_authorities = active_deferred_authorities;
self.staged_deferred_authorities = staged_deferred_authorities;
self.active_visibility_revision = active_visibility_revision;
self.staged_visibility_revision = staged_visibility_revision;
if active_visibility_revision > self.next_staged_visibility_revision {
self.next_staged_visibility_revision = active_visibility_revision;
}
}
to Attached
emit CommittedVisibleSetPublished { revision: active_visibility_revision }
}
transition PublishCommittedVisibleSetRunning {
on input PublishCommittedVisibleSet {
active_filter, staged_filter,
active_requested_deferred_names, staged_requested_deferred_names,
active_deferred_authorities, staged_deferred_authorities,
active_visibility_revision, staged_visibility_revision
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "active_not_behind_staged" { active_visibility_revision >= staged_visibility_revision }
guard "equal_revision_requires_equal_active_and_staged_input" {
active_visibility_revision != staged_visibility_revision
|| (active_filter == staged_filter
&& active_requested_deferred_names == staged_requested_deferred_names
&& active_deferred_authorities == staged_deferred_authorities)
}
guard "active_requested_subset_of_staged_requested" {
for_all(requested_name in active_requested_deferred_names, staged_requested_deferred_names.contains(requested_name))
}
guard "active_deferred_authorities_cover_names" {
for_all(requested_name in active_requested_deferred_names, active_deferred_authorities.contains_key(requested_name))
}
guard "staged_deferred_authorities_cover_names" {
for_all(requested_name in staged_requested_deferred_names, staged_deferred_authorities.contains_key(requested_name))
}
guard "active_deferred_authorities_are_name_scoped" {
for_all(witnessed_name in active_deferred_authorities.keys(), active_requested_deferred_names.contains(witnessed_name))
}
guard "staged_deferred_authorities_are_name_scoped" {
for_all(witnessed_name in staged_deferred_authorities.keys(), staged_requested_deferred_names.contains(witnessed_name))
}
guard "active_deferred_authorities_have_identity" {
deferred_authorities_have_identity(active_requested_deferred_names, active_deferred_authorities)
}
guard "staged_deferred_authorities_have_identity" {
deferred_authorities_have_identity(staged_requested_deferred_names, staged_deferred_authorities)
}
update {
self.active_filter = active_filter;
self.staged_filter = staged_filter;
self.active_deferred_names = active_requested_deferred_names;
self.staged_deferred_names = staged_requested_deferred_names;
self.active_deferred_authorities = active_deferred_authorities;
self.staged_deferred_authorities = staged_deferred_authorities;
self.active_visibility_revision = active_visibility_revision;
self.staged_visibility_revision = staged_visibility_revision;
if active_visibility_revision > self.next_staged_visibility_revision {
self.next_staged_visibility_revision = active_visibility_revision;
}
}
to Running
emit CommittedVisibleSetPublished { revision: active_visibility_revision }
}
transition PublishCommittedVisibleSetRetired {
on input PublishCommittedVisibleSet {
active_filter, staged_filter,
active_requested_deferred_names, staged_requested_deferred_names,
active_deferred_authorities, staged_deferred_authorities,
active_visibility_revision, staged_visibility_revision
}
guard { self.lifecycle_phase == Phase::Retired }
guard "session_registered" { self.session_id != None }
guard "active_not_behind_staged" { active_visibility_revision >= staged_visibility_revision }
guard "equal_revision_requires_equal_active_and_staged_input" {
active_visibility_revision != staged_visibility_revision
|| (active_filter == staged_filter
&& active_requested_deferred_names == staged_requested_deferred_names
&& active_deferred_authorities == staged_deferred_authorities)
}
guard "active_requested_subset_of_staged_requested" {
for_all(requested_name in active_requested_deferred_names, staged_requested_deferred_names.contains(requested_name))
}
guard "active_deferred_authorities_cover_names" {
for_all(requested_name in active_requested_deferred_names, active_deferred_authorities.contains_key(requested_name))
}
guard "staged_deferred_authorities_cover_names" {
for_all(requested_name in staged_requested_deferred_names, staged_deferred_authorities.contains_key(requested_name))
}
guard "active_deferred_authorities_are_name_scoped" {
for_all(witnessed_name in active_deferred_authorities.keys(), active_requested_deferred_names.contains(witnessed_name))
}
guard "staged_deferred_authorities_are_name_scoped" {
for_all(witnessed_name in staged_deferred_authorities.keys(), staged_requested_deferred_names.contains(witnessed_name))
}
guard "active_deferred_authorities_have_identity" {
deferred_authorities_have_identity(active_requested_deferred_names, active_deferred_authorities)
}
guard "staged_deferred_authorities_have_identity" {
deferred_authorities_have_identity(staged_requested_deferred_names, staged_deferred_authorities)
}
update {
self.active_filter = active_filter;
self.staged_filter = staged_filter;
self.active_deferred_names = active_requested_deferred_names;
self.staged_deferred_names = staged_requested_deferred_names;
self.active_deferred_authorities = active_deferred_authorities;
self.staged_deferred_authorities = staged_deferred_authorities;
self.active_visibility_revision = active_visibility_revision;
self.staged_visibility_revision = staged_visibility_revision;
if active_visibility_revision > self.next_staged_visibility_revision {
self.next_staged_visibility_revision = active_visibility_revision;
}
}
to Retired
emit CommittedVisibleSetPublished { revision: active_visibility_revision }
}
transition PublishCommittedVisibleSetStopped {
on input PublishCommittedVisibleSet {
active_filter, staged_filter,
active_requested_deferred_names, staged_requested_deferred_names,
active_deferred_authorities, staged_deferred_authorities,
active_visibility_revision, staged_visibility_revision
}
guard { self.lifecycle_phase == Phase::Stopped }
guard "session_registered" { self.session_id != None }
guard "active_not_behind_staged" { active_visibility_revision >= staged_visibility_revision }
guard "equal_revision_requires_equal_active_and_staged_input" {
active_visibility_revision != staged_visibility_revision
|| (active_filter == staged_filter
&& active_requested_deferred_names == staged_requested_deferred_names
&& active_deferred_authorities == staged_deferred_authorities)
}
guard "active_requested_subset_of_staged_requested" {
for_all(requested_name in active_requested_deferred_names, staged_requested_deferred_names.contains(requested_name))
}
guard "active_deferred_authorities_cover_names" {
for_all(requested_name in active_requested_deferred_names, active_deferred_authorities.contains_key(requested_name))
}
guard "staged_deferred_authorities_cover_names" {
for_all(requested_name in staged_requested_deferred_names, staged_deferred_authorities.contains_key(requested_name))
}
guard "active_deferred_authorities_are_name_scoped" {
for_all(witnessed_name in active_deferred_authorities.keys(), active_requested_deferred_names.contains(witnessed_name))
}
guard "staged_deferred_authorities_are_name_scoped" {
for_all(witnessed_name in staged_deferred_authorities.keys(), staged_requested_deferred_names.contains(witnessed_name))
}
guard "active_deferred_authorities_have_identity" {
deferred_authorities_have_identity(active_requested_deferred_names, active_deferred_authorities)
}
guard "staged_deferred_authorities_have_identity" {
deferred_authorities_have_identity(staged_requested_deferred_names, staged_deferred_authorities)
}
update {
self.active_filter = active_filter;
self.staged_filter = staged_filter;
self.active_deferred_names = active_requested_deferred_names;
self.staged_deferred_names = staged_requested_deferred_names;
self.active_deferred_authorities = active_deferred_authorities;
self.staged_deferred_authorities = staged_deferred_authorities;
self.active_visibility_revision = active_visibility_revision;
self.staged_visibility_revision = staged_visibility_revision;
if active_visibility_revision > self.next_staged_visibility_revision {
self.next_staged_visibility_revision = active_visibility_revision;
}
}
to Stopped
emit CommittedVisibleSetPublished { revision: active_visibility_revision }
}
transition RetireRequestedFromIdle {
on input Retire { session_id }
guard {
self.lifecycle_phase == Phase::Idle
|| self.lifecycle_phase == Phase::Attached
|| self.lifecycle_phase == Phase::Running
}
update {}
to Retired
emit RuntimeRetired { agent_runtime_id: self.active_runtime_id.get("value"), fence_token: self.active_fence_token.get("value") }
}
transition RetireAlreadyRetired {
on input Retire { session_id }
guard { self.lifecycle_phase == Phase::Retired }
update {}
to Retired
}
transition Reset {
on input Reset
guard {
self.lifecycle_phase == Phase::Initializing
|| self.lifecycle_phase == Phase::Idle
|| self.lifecycle_phase == Phase::Attached
|| self.lifecycle_phase == Phase::Retired
}
update {
self.current_run_id = None;
self.active_fence_token = None;
self.pre_run_phase = None;
self.silent_intent_overrides = EmptySet;
}
to Idle
emit RuntimeNotice { kind: RuntimeNoticeKind::Reset, detail: "runtime reset" }
}
transition StopRuntimeExecutorInitializing {
on input StopRuntimeExecutor { reason }
guard { self.lifecycle_phase == Phase::Initializing }
update {
self.current_run_id = None;
self.pre_run_phase = None;
self.silent_intent_overrides = EmptySet;
}
to Initializing
emit RuntimeNotice { kind: RuntimeNoticeKind::Stop, detail: "runtime executor stop requested" }
emit RuntimeEffectFact { kind: RuntimeEffectKind::StopRuntimeExecutor, reason: reason }
}
transition StopRuntimeExecutorIdle {
on input StopRuntimeExecutor { reason }
guard { self.lifecycle_phase == Phase::Idle }
update {
self.current_run_id = None;
self.pre_run_phase = None;
self.silent_intent_overrides = EmptySet;
}
to Idle
emit RuntimeNotice { kind: RuntimeNoticeKind::Stop, detail: "runtime executor stop requested" }
emit RuntimeEffectFact { kind: RuntimeEffectKind::StopRuntimeExecutor, reason: reason }
}
transition StopRuntimeExecutorRetired {
on input StopRuntimeExecutor { reason }
guard { self.lifecycle_phase == Phase::Retired }
update {
self.current_run_id = None;
self.pre_run_phase = None;
self.silent_intent_overrides = EmptySet;
}
to Retired
emit RuntimeNotice { kind: RuntimeNoticeKind::Stop, detail: "runtime executor stop requested" }
emit RuntimeEffectFact { kind: RuntimeEffectKind::StopRuntimeExecutor, reason: reason }
}
transition StopRuntimeExecutorAttached {
on input StopRuntimeExecutor { reason }
guard { self.lifecycle_phase == Phase::Attached }
update {
self.silent_intent_overrides = EmptySet;
}
to Attached
emit RuntimeNotice { kind: RuntimeNoticeKind::Stop, detail: "runtime executor stopped" }
emit RuntimeEffectFact { kind: RuntimeEffectKind::StopRuntimeExecutor, reason: reason }
}
transition StopRuntimeExecutorRunning {
on input StopRuntimeExecutor { reason }
guard { self.lifecycle_phase == Phase::Running }
update {
self.silent_intent_overrides = EmptySet;
}
to Running
emit RuntimeNotice { kind: RuntimeNoticeKind::Stop, detail: "runtime executor stopped" }
emit RuntimeEffectFact { kind: RuntimeEffectKind::StopRuntimeExecutor, reason: reason }
}
transition RuntimeExecutorExitedFromAttached {
on input RuntimeExecutorExited
guard { self.lifecycle_phase == Phase::Attached }
update {
self.current_run_id = None;
self.pre_run_phase = None;
self.silent_intent_overrides = EmptySet;
}
to Stopped
emit RuntimeNotice { kind: RuntimeNoticeKind::Exit, detail: "runtime executor exited" }
}
transition RuntimeExecutorExitedFromRunning {
on input RuntimeExecutorExited
guard { self.lifecycle_phase == Phase::Running }
update {
self.current_run_id = None;
self.pre_run_phase = None;
self.silent_intent_overrides = EmptySet;
}
to Stopped
emit RuntimeNotice { kind: RuntimeNoticeKind::Exit, detail: "runtime executor exited" }
}
transition RuntimeExecutorExitedFromIdle {
on input RuntimeExecutorExited
guard { self.lifecycle_phase == Phase::Idle }
update {
self.silent_intent_overrides = EmptySet;
}
to Stopped
emit RuntimeNotice { kind: RuntimeNoticeKind::Exit, detail: "runtime executor exited" }
}
transition RuntimeExecutorExitedFromRetired {
on input RuntimeExecutorExited
guard { self.lifecycle_phase == Phase::Retired }
update {
self.current_run_id = None;
self.pre_run_phase = None;
self.silent_intent_overrides = EmptySet;
}
to Stopped
emit RuntimeNotice { kind: RuntimeNoticeKind::Exit, detail: "runtime executor exited" }
}
transition RuntimeExecutorExitedFromStopped {
on input RuntimeExecutorExited
guard { self.lifecycle_phase == Phase::Stopped }
update {}
to Stopped
}
transition DestroyInitializing {
on input Destroy { session_id }
guard { self.lifecycle_phase == Phase::Initializing }
guard "runtime_is_bound" { self.active_runtime_id != None }
update {
self.current_run_id = None;
self.pre_run_phase = None;
self.silent_intent_overrides = EmptySet;
self.registration_phase = RegistrationPhase::Queuing;
}
to Destroyed
emit RuntimeDestroyed { agent_runtime_id: self.active_runtime_id.get("value"), fence_token: self.active_fence_token.get("value") }
}
transition Destroy {
on input Destroy { session_id }
guard {
self.lifecycle_phase == Phase::Idle
|| self.lifecycle_phase == Phase::Attached
|| self.lifecycle_phase == Phase::Running
|| self.lifecycle_phase == Phase::Retired
|| self.lifecycle_phase == Phase::Stopped
}
update {
self.current_run_id = None;
self.pre_run_phase = None;
self.silent_intent_overrides = EmptySet;
self.registration_phase = RegistrationPhase::Queuing;
}
to Destroyed
emit RuntimeDestroyed { agent_runtime_id: self.active_runtime_id.get("value"), fence_token: self.active_fence_token.get("value") }
}
transition RecoverInitializing {
on input Recover
guard { self.lifecycle_phase == Phase::Initializing }
update {}
to Initializing
emit RuntimeNotice { kind: RuntimeNoticeKind::Recover, detail: "runtime recovered" }
}
transition RecoverIdle {
on input Recover
guard { self.lifecycle_phase == Phase::Idle }
update {}
to Idle
emit RuntimeNotice { kind: RuntimeNoticeKind::Recover, detail: "runtime recovered" }
}
transition RecoverAttached {
on input Recover
guard { self.lifecycle_phase == Phase::Attached }
update {}
to Attached
emit RuntimeNotice { kind: RuntimeNoticeKind::Recover, detail: "runtime recovered" }
}
transition RecoverRetired {
on input Recover
guard { self.lifecycle_phase == Phase::Retired }
update {}
to Retired
emit RuntimeNotice { kind: RuntimeNoticeKind::Recover, detail: "runtime recovered" }
}
transition RecoverStopped {
on input Recover
guard { self.lifecycle_phase == Phase::Stopped }
update {}
to Stopped
emit RuntimeNotice { kind: RuntimeNoticeKind::Recover, detail: "runtime recovered" }
}
transition EnsureSessionWithExecutorIdle {
on input EnsureSessionWithExecutor { session_id }
guard { self.lifecycle_phase == Phase::Idle }
update {
self.registration_phase = RegistrationPhase::Active;
}
to Attached
}
transition EnsureSessionWithExecutorAttached {
on input EnsureSessionWithExecutor { session_id }
guard { self.lifecycle_phase == Phase::Attached }
update {
self.registration_phase = RegistrationPhase::Active;
}
to Attached
}
transition EnsureSessionWithExecutorRunning {
on input EnsureSessionWithExecutor { session_id }
guard { self.lifecycle_phase == Phase::Running }
update {
self.registration_phase = RegistrationPhase::Active;
}
to Running
}
transition EnsureSessionWithExecutorRetired {
on input EnsureSessionWithExecutor { session_id }
guard { self.lifecycle_phase == Phase::Retired }
update {}
to Retired
}
transition EnsureSessionWithExecutorStopped {
on input EnsureSessionWithExecutor { session_id }
guard { self.lifecycle_phase == Phase::Stopped }
update {}
to Stopped
}
transition SetSilentIntentsIdle {
on input SetSilentIntents { session_id, intents }
guard { self.lifecycle_phase == Phase::Idle }
guard "session_registered" { self.session_id != None }
update { self.silent_intent_overrides = intents; }
to Idle
}
transition SetSilentIntentsAttached {
on input SetSilentIntents { session_id, intents }
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
update { self.silent_intent_overrides = intents; }
to Attached
}
transition SetSilentIntentsRunning {
on input SetSilentIntents { session_id, intents }
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
update { self.silent_intent_overrides = intents; }
to Running
}
transition SetSilentIntentsRetired {
on input SetSilentIntents { session_id, intents }
guard { self.lifecycle_phase == Phase::Retired }
guard "session_registered" { self.session_id != None }
update { self.silent_intent_overrides = intents; }
to Retired
}
transition SetSilentIntentsStopped {
on input SetSilentIntents { session_id, intents }
guard { self.lifecycle_phase == Phase::Stopped }
guard "session_registered" { self.session_id != None }
update {}
to Stopped
}
transition Abort {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input Abort { session_id }
guard "session_registered" { self.session_id != None }
update {}
to Idle
}
transition Wait {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input Wait { session_id }
guard "session_registered" { self.session_id != None }
update {}
to Idle
}
transition AbortAll {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input AbortAll
update {}
to Idle
}
transition EnsureDrainRunningAttached {
on signal EnsureDrainRunning
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
update {}
to Attached
emit SpawnDrainTask
}
transition EnsureDrainRunningRunning {
on signal EnsureDrainRunning
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
update {}
to Running
emit SpawnDrainTask
}
transition Ingest {
per_phase [Idle, Attached, Running]
on input Ingest { runtime_id, work_id, origin }
guard "session_registered" { self.session_id != None }
update {}
to Idle
emit ResolveAdmission
}
transition PublishEvent {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input PublishEvent { kind }
guard "session_registered" { self.session_id != None }
update {}
to Idle
emit IngressNotice
}
transition AcceptWithCompletionIdleQueued {
on input AcceptWithCompletion { input_id, request_immediate_processing, interrupt_yielding, wake_if_idle }
guard { self.lifecycle_phase == Phase::Idle }
guard "session_registered" { self.session_id != None }
guard "request_immediate_processing" { request_immediate_processing == false }
guard "interrupt_yielding" { interrupt_yielding == false }
update {}
to Idle
emit IngressAccepted
emit PostAdmissionSignal { signal: PostAdmissionSignalKind::WakeLoop }
}
transition AcceptWithCompletionIdleImmediate {
on input AcceptWithCompletion { input_id, request_immediate_processing, interrupt_yielding, wake_if_idle }
guard { self.lifecycle_phase == Phase::Idle }
guard "session_registered" { self.session_id != None }
guard "request_immediate_processing" { request_immediate_processing == true }
guard "interrupt_yielding" { interrupt_yielding == false }
update {}
to Idle
emit IngressAccepted
emit PostAdmissionSignal { signal: PostAdmissionSignalKind::RequestImmediateProcessing }
}
transition AcceptWithCompletionAttachedImmediate {
on input AcceptWithCompletion { input_id, request_immediate_processing, interrupt_yielding, wake_if_idle }
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "request_immediate_processing" { request_immediate_processing == true }
guard "interrupt_yielding" { interrupt_yielding == false }
update {}
to Attached
emit IngressAccepted
emit PostAdmissionSignal { signal: PostAdmissionSignalKind::RequestImmediateProcessing }
emit SubmitRunPrimitive
}
transition AcceptWithCompletionAttachedQueued {
on input AcceptWithCompletion { input_id, request_immediate_processing, interrupt_yielding, wake_if_idle }
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "request_immediate_processing" { request_immediate_processing == false }
guard "interrupt_yielding" { interrupt_yielding == false }
update {}
to Attached
emit IngressAccepted
emit PostAdmissionSignal { signal: PostAdmissionSignalKind::WakeLoop }
}
transition AcceptWithCompletionRunningQueuedPassive {
on input AcceptWithCompletion { input_id, request_immediate_processing, interrupt_yielding, wake_if_idle }
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "request_immediate_processing" { request_immediate_processing == false }
guard "interrupt_yielding" { interrupt_yielding == false }
guard "wake_if_idle" { wake_if_idle == false }
update {}
to Running
emit IngressAccepted
}
transition AcceptWithCompletionRunningQueuedWakeIfIdle {
on input AcceptWithCompletion { input_id, request_immediate_processing, interrupt_yielding, wake_if_idle }
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "request_immediate_processing" { request_immediate_processing == false }
guard "interrupt_yielding" { interrupt_yielding == false }
guard "wake_if_idle" { wake_if_idle == true }
update {}
to Running
emit IngressAccepted
emit PostAdmissionSignal { signal: PostAdmissionSignalKind::WakeLoop }
}
transition AcceptWithCompletionRunningInterruptYielding {
on input AcceptWithCompletion { input_id, request_immediate_processing, interrupt_yielding, wake_if_idle }
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "request_immediate_processing" { request_immediate_processing == false }
guard "interrupt_yielding" { interrupt_yielding == true }
update {}
to Running
emit IngressAccepted
emit PostAdmissionSignal { signal: PostAdmissionSignalKind::InterruptYielding }
emit RuntimeEffectFact { kind: RuntimeEffectKind::CancelAfterBoundary, reason: "peer admission requested cooperative boundary cancel" }
}
transition AcceptWithCompletionRunningImmediate {
on input AcceptWithCompletion { input_id, request_immediate_processing, interrupt_yielding, wake_if_idle }
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "request_immediate_processing" { request_immediate_processing == true }
guard "interrupt_yielding" { interrupt_yielding == false }
update {}
to Running
emit IngressAccepted
emit PostAdmissionSignal { signal: PostAdmissionSignalKind::RequestImmediateProcessing }
emit RuntimeEffectFact { kind: RuntimeEffectKind::CancelAfterBoundary, reason: "peer admission requested cooperative boundary cancel" }
}
transition AcceptWithoutWake {
per_phase [Idle, Attached, Running]
on input AcceptWithoutWake { input_id }
guard "session_registered" { self.session_id != None }
update {}
to Idle
emit IngressAccepted
}
transition ClassifyExternalEnvelopeMessageAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_message" { envelope_kind == PeerIngressEnvelopeClass::Message }
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::ActionableMessage,
kind: PeerIngressAdmittedKind::Message,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeMessageRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_message" { envelope_kind == PeerIngressEnvelopeClass::Message }
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::ActionableMessage,
kind: PeerIngressAdmittedKind::Message,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestPeerAddedAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_request_peer_added" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "mob.peer_added"
}
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleAdded,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerAdded),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestPeerAddedIdle {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Idle }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_request_peer_added" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "mob.peer_added"
}
update {}
to Idle
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleAdded,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerAdded),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestPeerAddedRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_request_peer_added" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "mob.peer_added"
}
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleAdded,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerAdded),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestPeerRetiredAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_request_peer_retired" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "mob.peer_retired"
}
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleRetired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerRetired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestPeerRetiredIdle {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Idle }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_request_peer_retired" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "mob.peer_retired"
}
update {}
to Idle
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleRetired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerRetired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestPeerRetiredRetired {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Retired }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_request_peer_retired" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "mob.peer_retired"
}
update {}
to Retired
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleRetired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerRetired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestPeerRetiredStopped {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Stopped }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_request_peer_retired" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "mob.peer_retired"
}
update {}
to Stopped
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleRetired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerRetired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestPeerRetiredRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_request_peer_retired" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "mob.peer_retired"
}
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleRetired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerRetired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestPeerUnwiredAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_request_peer_unwired" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "mob.peer_unwired"
}
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleUnwired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerUnwired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestPeerUnwiredIdle {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Idle }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_request_peer_unwired" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "mob.peer_unwired"
}
update {}
to Idle
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleUnwired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerUnwired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestPeerUnwiredRetired {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Retired }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_request_peer_unwired" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "mob.peer_unwired"
}
update {}
to Retired
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleUnwired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerUnwired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestPeerUnwiredStopped {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Stopped }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_request_peer_unwired" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "mob.peer_unwired"
}
update {}
to Stopped
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleUnwired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerUnwired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestPeerUnwiredRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_request_peer_unwired" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "mob.peer_unwired"
}
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleUnwired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerUnwired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestSupervisorSilentAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_supervisor_silent_request" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "supervisor.bridge"
&& self.silent_intent_overrides.contains(request_intent)
}
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::SilentRequest,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::SupervisorBridgeExempt,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestSupervisorSilentRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_supervisor_silent_request" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "supervisor.bridge"
&& self.silent_intent_overrides.contains(request_intent)
}
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::SilentRequest,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::SupervisorBridgeExempt,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestSilentAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_silent_request" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent != "supervisor.bridge"
&& request_intent != "mob.peer_added"
&& request_intent != "mob.peer_retired"
&& request_intent != "mob.peer_unwired"
&& self.silent_intent_overrides.contains(request_intent)
}
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::SilentRequest,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestSilentRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_silent_request" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent != "supervisor.bridge"
&& request_intent != "mob.peer_added"
&& request_intent != "mob.peer_retired"
&& request_intent != "mob.peer_unwired"
&& self.silent_intent_overrides.contains(request_intent)
}
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::SilentRequest,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestSupervisorAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_supervisor_request" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "supervisor.bridge"
&& !self.silent_intent_overrides.contains(request_intent)
}
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::ActionableRequest,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::SupervisorBridgeExempt,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestSupervisorRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_supervisor_request" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent == "supervisor.bridge"
&& !self.silent_intent_overrides.contains(request_intent)
}
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::ActionableRequest,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::SupervisorBridgeExempt,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestActionableAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_actionable_request" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent != "supervisor.bridge"
&& request_intent != "mob.peer_added"
&& request_intent != "mob.peer_retired"
&& request_intent != "mob.peer_unwired"
&& !self.silent_intent_overrides.contains(request_intent)
}
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::ActionableRequest,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeRequestActionableRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_actionable_request" {
envelope_kind == PeerIngressEnvelopeClass::Request
&& request_intent != "supervisor.bridge"
&& request_intent != "mob.peer_added"
&& request_intent != "mob.peer_retired"
&& request_intent != "mob.peer_unwired"
&& !self.silent_intent_overrides.contains(request_intent)
}
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::ActionableRequest,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(item_id),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeLifecycleAddedIdle {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Idle }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_lifecycle_added" {
envelope_kind == PeerIngressEnvelopeClass::Lifecycle
&& lifecycle_kind == PeerIngressLifecycleClass::PeerAdded
}
update {}
to Idle
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleAdded,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerAdded),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeLifecycleAddedAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_lifecycle_added" {
envelope_kind == PeerIngressEnvelopeClass::Lifecycle
&& lifecycle_kind == PeerIngressLifecycleClass::PeerAdded
}
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleAdded,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerAdded),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeLifecycleAddedRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_lifecycle_added" {
envelope_kind == PeerIngressEnvelopeClass::Lifecycle
&& lifecycle_kind == PeerIngressLifecycleClass::PeerAdded
}
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleAdded,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerAdded),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeLifecycleRetiredIdle {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Idle }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_lifecycle_retired" {
envelope_kind == PeerIngressEnvelopeClass::Lifecycle
&& lifecycle_kind == PeerIngressLifecycleClass::PeerRetired
}
update {}
to Idle
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleRetired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerRetired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeLifecycleRetiredRetired {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Retired }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_lifecycle_retired" {
envelope_kind == PeerIngressEnvelopeClass::Lifecycle
&& lifecycle_kind == PeerIngressLifecycleClass::PeerRetired
}
update {}
to Retired
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleRetired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerRetired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeLifecycleRetiredStopped {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Stopped }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_lifecycle_retired" {
envelope_kind == PeerIngressEnvelopeClass::Lifecycle
&& lifecycle_kind == PeerIngressLifecycleClass::PeerRetired
}
update {}
to Stopped
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleRetired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerRetired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeLifecycleRetiredAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_lifecycle_retired" {
envelope_kind == PeerIngressEnvelopeClass::Lifecycle
&& lifecycle_kind == PeerIngressLifecycleClass::PeerRetired
}
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleRetired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerRetired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeLifecycleRetiredRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_lifecycle_retired" {
envelope_kind == PeerIngressEnvelopeClass::Lifecycle
&& lifecycle_kind == PeerIngressLifecycleClass::PeerRetired
}
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleRetired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerRetired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeLifecycleUnwiredIdle {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Idle }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_lifecycle_unwired" {
envelope_kind == PeerIngressEnvelopeClass::Lifecycle
&& lifecycle_kind == PeerIngressLifecycleClass::PeerUnwired
}
update {}
to Idle
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleUnwired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerUnwired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeLifecycleUnwiredRetired {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Retired }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_lifecycle_unwired" {
envelope_kind == PeerIngressEnvelopeClass::Lifecycle
&& lifecycle_kind == PeerIngressLifecycleClass::PeerUnwired
}
update {}
to Retired
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleUnwired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerUnwired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeLifecycleUnwiredStopped {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Stopped }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_lifecycle_unwired" {
envelope_kind == PeerIngressEnvelopeClass::Lifecycle
&& lifecycle_kind == PeerIngressLifecycleClass::PeerUnwired
}
update {}
to Stopped
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleUnwired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerUnwired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeLifecycleUnwiredAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_lifecycle_unwired" {
envelope_kind == PeerIngressEnvelopeClass::Lifecycle
&& lifecycle_kind == PeerIngressLifecycleClass::PeerUnwired
}
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleUnwired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerUnwired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeLifecycleUnwiredRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_lifecycle_unwired" {
envelope_kind == PeerIngressEnvelopeClass::Lifecycle
&& lifecycle_kind == PeerIngressLifecycleClass::PeerUnwired
}
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PeerLifecycleUnwired,
kind: PeerIngressAdmittedKind::Request,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: Some(PeerIngressLifecycleClass::PeerUnwired),
lifecycle_peer: Some(if lifecycle_peer_param.is_some()
&& lifecycle_peer_param.get("value") != ""
{
lifecycle_peer_param.get("value")
} else {
from_peer
}),
request_id: None,
response_terminality: None
}
}
transition ClassifyExternalEnvelopeResponseAcceptedAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_response_accepted" {
envelope_kind == PeerIngressEnvelopeClass::Response
&& response_status == PeerIngressResponseStatus::Accepted
}
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::ResponseProgress,
kind: PeerIngressAdmittedKind::Response,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(in_reply_to),
response_terminality: Some(PeerIngressResponseTerminality::Progress)
}
}
transition ClassifyExternalEnvelopeResponseAcceptedRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_response_accepted" {
envelope_kind == PeerIngressEnvelopeClass::Response
&& response_status == PeerIngressResponseStatus::Accepted
}
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::ResponseProgress,
kind: PeerIngressAdmittedKind::Response,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(in_reply_to),
response_terminality: Some(PeerIngressResponseTerminality::Progress)
}
}
transition ClassifyExternalEnvelopeResponseCompletedAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_response_completed" {
envelope_kind == PeerIngressEnvelopeClass::Response
&& response_status == PeerIngressResponseStatus::Completed
}
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::ResponseTerminal,
kind: PeerIngressAdmittedKind::Response,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(in_reply_to),
response_terminality: Some(PeerIngressResponseTerminality::TerminalCompleted)
}
}
transition ClassifyExternalEnvelopeResponseCompletedRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_response_completed" {
envelope_kind == PeerIngressEnvelopeClass::Response
&& response_status == PeerIngressResponseStatus::Completed
}
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::ResponseTerminal,
kind: PeerIngressAdmittedKind::Response,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(in_reply_to),
response_terminality: Some(PeerIngressResponseTerminality::TerminalCompleted)
}
}
transition ClassifyExternalEnvelopeResponseFailedAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_response_failed" {
envelope_kind == PeerIngressEnvelopeClass::Response
&& response_status == PeerIngressResponseStatus::Failed
}
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::ResponseTerminal,
kind: PeerIngressAdmittedKind::Response,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(in_reply_to),
response_terminality: Some(PeerIngressResponseTerminality::TerminalFailed)
}
}
transition ClassifyExternalEnvelopeResponseFailedRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_response_failed" {
envelope_kind == PeerIngressEnvelopeClass::Response
&& response_status == PeerIngressResponseStatus::Failed
}
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::ResponseTerminal,
kind: PeerIngressAdmittedKind::Response,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(in_reply_to),
response_terminality: Some(PeerIngressResponseTerminality::TerminalFailed)
}
}
transition ClassifyExternalEnvelopeAckAttached {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_ack" { envelope_kind == PeerIngressEnvelopeClass::Ack }
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::Ack,
kind: PeerIngressAdmittedKind::Ack,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(in_reply_to),
response_terminality: None
}
}
transition ClassifyExternalEnvelopeAckRunning {
on signal ClassifyExternalEnvelope {
item_id, from_peer, envelope_kind, request_intent, lifecycle_kind,
lifecycle_peer_param, response_status, in_reply_to
}
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
guard "peer_ingress_ack" { envelope_kind == PeerIngressEnvelopeClass::Ack }
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::Ack,
kind: PeerIngressAdmittedKind::Ack,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: Some(in_reply_to),
response_terminality: None
}
}
transition ClassifyPlainEventAttached {
on signal ClassifyPlainEvent { source_name }
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
update {}
to Attached
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PlainEvent,
kind: PeerIngressAdmittedKind::PlainEvent,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: None,
response_terminality: None
}
}
transition ClassifyPlainEventRunning {
on signal ClassifyPlainEvent { source_name }
guard { self.lifecycle_phase == Phase::Running }
guard "session_registered" { self.session_id != None }
update {}
to Running
emit EnqueueClassifiedEntry
emit PeerIngressClassified {
class: PeerIngressInputClass::PlainEvent,
kind: PeerIngressAdmittedKind::PlainEvent,
auth: PeerIngressAuthClass::Required,
lifecycle_kind: None,
lifecycle_peer: None,
request_id: None,
response_terminality: None
}
}
transition PrepareIdle {
on input Prepare { session_id, run_id }
guard { self.lifecycle_phase == Phase::Idle }
guard "session_registered" { self.session_id != None }
update {
self.current_run_id = Some(run_id);
self.pre_run_phase = Some(PreRunPhase::Idle);
}
to Running
emit SubmitRunPrimitive
}
transition PrepareAttached {
on input Prepare { session_id, run_id }
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
update {
self.current_run_id = Some(run_id);
self.pre_run_phase = Some(PreRunPhase::Attached);
}
to Running
emit SubmitRunPrimitive
}
transition DrainQueuedRunRetired {
on signal DrainQueuedRun { run_id }
guard { self.lifecycle_phase == Phase::Retired }
update {
self.current_run_id = Some(run_id);
self.pre_run_phase = Some(PreRunPhase::Retired);
}
to Running
emit SubmitRunPrimitive
}
transition StartConversationRunInitializing {
on input StartConversationRun { run_id, primitive_kind, admitted_content_shape, vision_enabled, image_tool_results_enabled, max_extraction_retries }
guard { self.lifecycle_phase == Phase::Initializing }
guard "turn_resettable" {
self.turn_phase == TurnPhase::Ready
|| self.turn_phase == TurnPhase::Completed
|| self.turn_phase == TurnPhase::Failed
|| self.turn_phase == TurnPhase::Cancelled
}
guard "conversation_shape_matches_primitive" {
primitive_kind == TurnPrimitiveKind::ConversationTurn
&& (admitted_content_shape == ContentShape::Conversation
|| admitted_content_shape == ContentShape::ConversationAndContext
|| admitted_content_shape == ContentShape::Context
|| admitted_content_shape == ContentShape::Empty)
}
update {
self.current_run_id = Some(run_id);
self.pre_run_phase = Some(PreRunPhase::Attached);
self.turn_phase = TurnPhase::ApplyingPrimitive;
self.primitive_kind = Some(primitive_kind);
self.admitted_content_shape = Some(admitted_content_shape);
self.vision_enabled = vision_enabled;
self.image_tool_results_enabled = image_tool_results_enabled;
self.tool_calls_pending = 0;
self.pending_op_refs = EmptySet;
self.barrier_operation_ids = EmptySet;
self.has_barrier_ops = false;
self.barrier_satisfied = false;
self.boundary_count = 0;
self.cancel_after_boundary = false;
self.terminal_outcome = None;
self.terminal_cause_kind = None;
self.last_runtime_apply_failure_cause = None;
self.last_runtime_apply_failure_message = None;
self.extraction_attempts = 0;
self.max_extraction_retries = max_extraction_retries;
self.llm_retry_attempt = 0;
self.llm_retry_max_retries = 0;
self.llm_retry_selected_delay_ms = 0;
self.llm_retry_last_failure_kind = None;
}
to Running
emit TurnRunStarted { run_id: run_id }
}
transition StartConversationRunAttached {
on input StartConversationRun { run_id, primitive_kind, admitted_content_shape, vision_enabled, image_tool_results_enabled, max_extraction_retries }
guard { self.lifecycle_phase == Phase::Attached }
guard "turn_resettable" {
self.turn_phase == TurnPhase::Ready
|| self.turn_phase == TurnPhase::Completed
|| self.turn_phase == TurnPhase::Failed
|| self.turn_phase == TurnPhase::Cancelled
}
guard "conversation_shape_matches_primitive" {
primitive_kind == TurnPrimitiveKind::ConversationTurn
&& (admitted_content_shape == ContentShape::Conversation
|| admitted_content_shape == ContentShape::ConversationAndContext
|| admitted_content_shape == ContentShape::Context
|| admitted_content_shape == ContentShape::Empty)
}
update {
self.current_run_id = Some(run_id);
self.pre_run_phase = Some(PreRunPhase::Attached);
self.turn_phase = TurnPhase::ApplyingPrimitive;
self.primitive_kind = Some(primitive_kind);
self.admitted_content_shape = Some(admitted_content_shape);
self.vision_enabled = vision_enabled;
self.image_tool_results_enabled = image_tool_results_enabled;
self.tool_calls_pending = 0;
self.pending_op_refs = EmptySet;
self.barrier_operation_ids = EmptySet;
self.has_barrier_ops = false;
self.barrier_satisfied = false;
self.boundary_count = 0;
self.cancel_after_boundary = false;
self.terminal_outcome = None;
self.terminal_cause_kind = None;
self.last_runtime_apply_failure_cause = None;
self.last_runtime_apply_failure_message = None;
self.extraction_attempts = 0;
self.max_extraction_retries = max_extraction_retries;
self.llm_retry_attempt = 0;
self.llm_retry_max_retries = 0;
self.llm_retry_selected_delay_ms = 0;
self.llm_retry_last_failure_kind = None;
}
to Running
emit TurnRunStarted { run_id: run_id }
}
transition StartConversationRunRunning {
on input StartConversationRun { run_id, primitive_kind, admitted_content_shape, vision_enabled, image_tool_results_enabled, max_extraction_retries }
guard { self.lifecycle_phase == Phase::Running }
guard "turn_resettable" {
self.turn_phase == TurnPhase::Ready
|| self.turn_phase == TurnPhase::Completed
|| self.turn_phase == TurnPhase::Failed
|| self.turn_phase == TurnPhase::Cancelled
}
guard "conversation_shape_matches_primitive" {
primitive_kind == TurnPrimitiveKind::ConversationTurn
&& (admitted_content_shape == ContentShape::Conversation
|| admitted_content_shape == ContentShape::ConversationAndContext
|| admitted_content_shape == ContentShape::Context
|| admitted_content_shape == ContentShape::Empty)
}
update {
self.current_run_id = Some(run_id);
self.turn_phase = TurnPhase::ApplyingPrimitive;
self.primitive_kind = Some(primitive_kind);
self.admitted_content_shape = Some(admitted_content_shape);
self.vision_enabled = vision_enabled;
self.image_tool_results_enabled = image_tool_results_enabled;
self.tool_calls_pending = 0;
self.pending_op_refs = EmptySet;
self.barrier_operation_ids = EmptySet;
self.has_barrier_ops = false;
self.barrier_satisfied = false;
self.boundary_count = 0;
self.cancel_after_boundary = false;
self.terminal_outcome = None;
self.terminal_cause_kind = None;
self.last_runtime_apply_failure_cause = None;
self.last_runtime_apply_failure_message = None;
self.extraction_attempts = 0;
self.max_extraction_retries = max_extraction_retries;
self.llm_retry_attempt = 0;
self.llm_retry_max_retries = 0;
self.llm_retry_selected_delay_ms = 0;
self.llm_retry_last_failure_kind = None;
}
to Running
emit TurnRunStarted { run_id: run_id }
}
transition StartImmediateAppendInitializing {
on input StartImmediateAppend { run_id }
guard { self.lifecycle_phase == Phase::Initializing }
guard "turn_resettable" {
self.turn_phase == TurnPhase::Ready
|| self.turn_phase == TurnPhase::Completed
|| self.turn_phase == TurnPhase::Failed
|| self.turn_phase == TurnPhase::Cancelled
}
update {
self.current_run_id = Some(run_id);
self.pre_run_phase = Some(PreRunPhase::Attached);
self.turn_phase = TurnPhase::ApplyingPrimitive;
self.primitive_kind = Some(TurnPrimitiveKind::ImmediateAppend);
self.admitted_content_shape = Some(ContentShape::ImmediateAppend);
self.vision_enabled = false;
self.image_tool_results_enabled = false;
self.tool_calls_pending = 0;
self.pending_op_refs = EmptySet;
self.barrier_operation_ids = EmptySet;
self.has_barrier_ops = false;
self.barrier_satisfied = false;
self.boundary_count = 0;
self.cancel_after_boundary = false;
self.terminal_outcome = None;
self.terminal_cause_kind = None;
self.last_runtime_apply_failure_cause = None;
self.last_runtime_apply_failure_message = None;
self.extraction_attempts = 0;
self.max_extraction_retries = 0;
self.llm_retry_attempt = 0;
self.llm_retry_max_retries = 0;
self.llm_retry_selected_delay_ms = 0;
self.llm_retry_last_failure_kind = None;
}
to Running
emit TurnRunStarted { run_id: run_id }
}
transition StartImmediateAppendAttached {
on input StartImmediateAppend { run_id }
guard { self.lifecycle_phase == Phase::Attached }
guard "turn_resettable" {
self.turn_phase == TurnPhase::Ready
|| self.turn_phase == TurnPhase::Completed
|| self.turn_phase == TurnPhase::Failed
|| self.turn_phase == TurnPhase::Cancelled
}
update {
self.current_run_id = Some(run_id);
self.pre_run_phase = Some(PreRunPhase::Attached);
self.turn_phase = TurnPhase::ApplyingPrimitive;
self.primitive_kind = Some(TurnPrimitiveKind::ImmediateAppend);
self.admitted_content_shape = Some(ContentShape::ImmediateAppend);
self.vision_enabled = false;
self.image_tool_results_enabled = false;
self.tool_calls_pending = 0;
self.pending_op_refs = EmptySet;
self.barrier_operation_ids = EmptySet;
self.has_barrier_ops = false;
self.barrier_satisfied = false;
self.boundary_count = 0;
self.cancel_after_boundary = false;
self.terminal_outcome = None;
self.terminal_cause_kind = None;
self.last_runtime_apply_failure_cause = None;
self.last_runtime_apply_failure_message = None;
self.extraction_attempts = 0;
self.max_extraction_retries = 0;
self.llm_retry_attempt = 0;
self.llm_retry_max_retries = 0;
self.llm_retry_selected_delay_ms = 0;
self.llm_retry_last_failure_kind = None;
}
to Running
emit TurnRunStarted { run_id: run_id }
}
transition StartImmediateAppendRunning {
on input StartImmediateAppend { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "turn_resettable" {
self.turn_phase == TurnPhase::Ready
|| self.turn_phase == TurnPhase::Completed
|| self.turn_phase == TurnPhase::Failed
|| self.turn_phase == TurnPhase::Cancelled
}
update {
self.current_run_id = Some(run_id);
self.turn_phase = TurnPhase::ApplyingPrimitive;
self.primitive_kind = Some(TurnPrimitiveKind::ImmediateAppend);
self.admitted_content_shape = Some(ContentShape::ImmediateAppend);
self.vision_enabled = false;
self.image_tool_results_enabled = false;
self.tool_calls_pending = 0;
self.pending_op_refs = EmptySet;
self.barrier_operation_ids = EmptySet;
self.has_barrier_ops = false;
self.barrier_satisfied = false;
self.boundary_count = 0;
self.cancel_after_boundary = false;
self.terminal_outcome = None;
self.terminal_cause_kind = None;
self.last_runtime_apply_failure_cause = None;
self.last_runtime_apply_failure_message = None;
self.extraction_attempts = 0;
self.max_extraction_retries = 0;
self.llm_retry_attempt = 0;
self.llm_retry_max_retries = 0;
self.llm_retry_selected_delay_ms = 0;
self.llm_retry_last_failure_kind = None;
}
to Running
emit TurnRunStarted { run_id: run_id }
}
transition StartImmediateContextInitializing {
on input StartImmediateContext { run_id }
guard { self.lifecycle_phase == Phase::Initializing }
guard "turn_resettable" {
self.turn_phase == TurnPhase::Ready
|| self.turn_phase == TurnPhase::Completed
|| self.turn_phase == TurnPhase::Failed
|| self.turn_phase == TurnPhase::Cancelled
}
update {
self.current_run_id = Some(run_id);
self.pre_run_phase = Some(PreRunPhase::Attached);
self.turn_phase = TurnPhase::ApplyingPrimitive;
self.primitive_kind = Some(TurnPrimitiveKind::ImmediateContextAppend);
self.admitted_content_shape = Some(ContentShape::ImmediateContext);
self.vision_enabled = false;
self.image_tool_results_enabled = false;
self.tool_calls_pending = 0;
self.pending_op_refs = EmptySet;
self.barrier_operation_ids = EmptySet;
self.has_barrier_ops = false;
self.barrier_satisfied = false;
self.boundary_count = 0;
self.cancel_after_boundary = false;
self.terminal_outcome = None;
self.terminal_cause_kind = None;
self.last_runtime_apply_failure_cause = None;
self.last_runtime_apply_failure_message = None;
self.extraction_attempts = 0;
self.max_extraction_retries = 0;
self.llm_retry_attempt = 0;
self.llm_retry_max_retries = 0;
self.llm_retry_selected_delay_ms = 0;
self.llm_retry_last_failure_kind = None;
}
to Running
emit TurnRunStarted { run_id: run_id }
}
transition StartImmediateContextAttached {
on input StartImmediateContext { run_id }
guard { self.lifecycle_phase == Phase::Attached }
guard "turn_resettable" {
self.turn_phase == TurnPhase::Ready
|| self.turn_phase == TurnPhase::Completed
|| self.turn_phase == TurnPhase::Failed
|| self.turn_phase == TurnPhase::Cancelled
}
update {
self.current_run_id = Some(run_id);
self.pre_run_phase = Some(PreRunPhase::Attached);
self.turn_phase = TurnPhase::ApplyingPrimitive;
self.primitive_kind = Some(TurnPrimitiveKind::ImmediateContextAppend);
self.admitted_content_shape = Some(ContentShape::ImmediateContext);
self.vision_enabled = false;
self.image_tool_results_enabled = false;
self.tool_calls_pending = 0;
self.pending_op_refs = EmptySet;
self.barrier_operation_ids = EmptySet;
self.has_barrier_ops = false;
self.barrier_satisfied = false;
self.boundary_count = 0;
self.cancel_after_boundary = false;
self.terminal_outcome = None;
self.terminal_cause_kind = None;
self.last_runtime_apply_failure_cause = None;
self.last_runtime_apply_failure_message = None;
self.extraction_attempts = 0;
self.max_extraction_retries = 0;
self.llm_retry_attempt = 0;
self.llm_retry_max_retries = 0;
self.llm_retry_selected_delay_ms = 0;
self.llm_retry_last_failure_kind = None;
}
to Running
emit TurnRunStarted { run_id: run_id }
}
transition StartImmediateContextRunning {
on input StartImmediateContext { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "turn_resettable" {
self.turn_phase == TurnPhase::Ready
|| self.turn_phase == TurnPhase::Completed
|| self.turn_phase == TurnPhase::Failed
|| self.turn_phase == TurnPhase::Cancelled
}
update {
self.current_run_id = Some(run_id);
self.turn_phase = TurnPhase::ApplyingPrimitive;
self.primitive_kind = Some(TurnPrimitiveKind::ImmediateContextAppend);
self.admitted_content_shape = Some(ContentShape::ImmediateContext);
self.vision_enabled = false;
self.image_tool_results_enabled = false;
self.tool_calls_pending = 0;
self.pending_op_refs = EmptySet;
self.barrier_operation_ids = EmptySet;
self.has_barrier_ops = false;
self.barrier_satisfied = false;
self.boundary_count = 0;
self.cancel_after_boundary = false;
self.terminal_outcome = None;
self.terminal_cause_kind = None;
self.last_runtime_apply_failure_cause = None;
self.last_runtime_apply_failure_message = None;
self.extraction_attempts = 0;
self.max_extraction_retries = 0;
self.llm_retry_attempt = 0;
self.llm_retry_max_retries = 0;
self.llm_retry_selected_delay_ms = 0;
self.llm_retry_last_failure_kind = None;
}
to Running
emit TurnRunStarted { run_id: run_id }
}
transition PrimitiveAppliedConversation {
on input PrimitiveApplied
guard { self.lifecycle_phase == Phase::Running }
guard "turn_applying_conversation" {
self.turn_phase == TurnPhase::ApplyingPrimitive
&& self.primitive_kind == Some(TurnPrimitiveKind::ConversationTurn)
}
update {
self.turn_phase = TurnPhase::CallingLlm;
}
to Running
emit TurnCheckCompaction
}
transition PrimitiveAppliedImmediate {
on input PrimitiveApplied
guard { self.lifecycle_phase == Phase::Running }
guard "turn_applying_immediate" {
self.turn_phase == TurnPhase::ApplyingPrimitive
&& (self.primitive_kind == Some(TurnPrimitiveKind::ImmediateAppend)
|| self.primitive_kind == Some(TurnPrimitiveKind::ImmediateContextAppend))
}
update {
self.boundary_count = self.boundary_count + 1;
self.turn_phase = TurnPhase::Completed;
self.terminal_outcome = Some(TurnTerminalOutcome::Completed);
}
to Running
emit TurnBoundaryApplied { run_id: self.current_run_id.get("value"), boundary_sequence: self.boundary_count }
emit TurnRunCompleted { run_id: self.current_run_id.get("value"), outcome: TurnTerminalOutcome::Completed }
emit TurnCheckCompaction
}
transition LlmReturnedToolCallsPositive {
on input LlmReturnedToolCalls { tool_count }
guard { self.lifecycle_phase == Phase::Running }
guard "turn_calling_llm" { self.turn_phase == TurnPhase::CallingLlm }
guard "tool_count_positive" { tool_count > 0 }
update {
self.turn_phase = TurnPhase::WaitingForOps;
self.tool_calls_pending = tool_count;
}
to Running
}
transition LlmReturnedToolCallsZero {
on input LlmReturnedToolCalls { tool_count }
guard { self.lifecycle_phase == Phase::Running }
guard "turn_calling_llm" { self.turn_phase == TurnPhase::CallingLlm }
guard "tool_count_zero" { tool_count == 0 }
update {
self.turn_phase = TurnPhase::DrainingBoundary;
self.tool_calls_pending = 0;
}
to Running
}
transition LlmReturnedTerminal {
on input LlmReturnedTerminal
guard { self.lifecycle_phase == Phase::Running }
guard "turn_calling_llm" { self.turn_phase == TurnPhase::CallingLlm }
update {
self.turn_phase = TurnPhase::DrainingBoundary;
}
to Running
}
transition RegisterPendingOps {
on input RegisterPendingOps { op_refs, barrier_operation_ids }
guard { self.lifecycle_phase == Phase::Running }
guard "turn_waiting_or_calling" { self.turn_phase == TurnPhase::CallingLlm || self.turn_phase == TurnPhase::WaitingForOps }
update {
self.turn_phase = TurnPhase::WaitingForOps;
self.pending_op_refs = op_refs;
self.barrier_operation_ids = barrier_operation_ids;
self.has_barrier_ops = self.barrier_operation_ids != EmptySet;
self.barrier_satisfied = self.barrier_operation_ids == EmptySet;
self.tool_calls_pending = 0;
}
to Running
}
transition ToolCallsResolvedToCalling {
on input ToolCallsResolved
guard { self.lifecycle_phase == Phase::Running }
guard "turn_waiting_for_ops" { self.turn_phase == TurnPhase::WaitingForOps }
guard "barrier_not_satisfied" { self.barrier_satisfied == false }
update {
self.turn_phase = TurnPhase::CallingLlm;
}
to Running
}
transition ToolCallsResolvedToBoundary {
on input ToolCallsResolved
guard { self.lifecycle_phase == Phase::Running }
guard "turn_waiting_for_ops" { self.turn_phase == TurnPhase::WaitingForOps }
guard "barrier_satisfied" { self.barrier_satisfied == true }
update {
self.turn_phase = TurnPhase::DrainingBoundary;
}
to Running
}
transition OpsBarrierSatisfied {
on input OpsBarrierSatisfied { operation_ids }
guard { self.lifecycle_phase == Phase::Running }
guard "turn_waiting_for_ops" { self.turn_phase == TurnPhase::WaitingForOps }
guard "matching_barrier_ids" { operation_ids == self.barrier_operation_ids }
update {
self.barrier_satisfied = true;
self.pending_op_refs = EmptySet;
self.barrier_operation_ids = EmptySet;
self.has_barrier_ops = false;
}
to Running
}
transition BoundaryContinue {
on input BoundaryContinue
guard { self.lifecycle_phase == Phase::Running }
guard "turn_draining_boundary" { self.turn_phase == TurnPhase::DrainingBoundary }
update {
self.boundary_count = self.boundary_count + 1;
self.turn_phase = TurnPhase::CallingLlm;
}
to Running
emit TurnBoundaryApplied { run_id: self.current_run_id.get("value"), boundary_sequence: self.boundary_count }
emit TurnCheckCompaction
}
transition BoundaryComplete {
on input BoundaryComplete
guard { self.lifecycle_phase == Phase::Running }
guard "turn_draining_boundary" { self.turn_phase == TurnPhase::DrainingBoundary }
update {
self.boundary_count = self.boundary_count + 1;
self.turn_phase = TurnPhase::Completed;
self.terminal_outcome = Some(TurnTerminalOutcome::Completed);
}
to Running
emit TurnBoundaryApplied { run_id: self.current_run_id.get("value"), boundary_sequence: self.boundary_count }
emit TurnRunCompleted { run_id: self.current_run_id.get("value"), outcome: TurnTerminalOutcome::Completed }
emit TurnCheckCompaction
}
transition EnterExtraction {
on input EnterExtraction { max_extraction_retries }
guard { self.lifecycle_phase == Phase::Running }
guard "turn_draining_boundary" { self.turn_phase == TurnPhase::DrainingBoundary }
update {
self.turn_phase = TurnPhase::Extracting;
self.max_extraction_retries = max_extraction_retries;
}
to Running
}
transition ExtractionStart {
on input ExtractionStart
guard { self.lifecycle_phase == Phase::Running }
guard "turn_extracting" { self.turn_phase == TurnPhase::Extracting }
update {
self.turn_phase = TurnPhase::CallingLlm;
}
to Running
}
transition ExtractionValidationPassed {
on input ExtractionValidationPassed
guard { self.lifecycle_phase == Phase::Running }
guard "turn_extracting" { self.turn_phase == TurnPhase::Extracting }
update {
self.turn_phase = TurnPhase::Completed;
self.terminal_outcome = Some(TurnTerminalOutcome::Completed);
}
to Running
emit TurnRunCompleted { run_id: self.current_run_id.get("value"), outcome: TurnTerminalOutcome::Completed }
emit TurnCheckCompaction
}
transition ExtractionValidationFailedRetry {
on input ExtractionValidationFailed { error }
guard { self.lifecycle_phase == Phase::Running }
guard "turn_extracting" { self.turn_phase == TurnPhase::Extracting }
guard "retries_remaining" { self.extraction_attempts < self.max_extraction_retries }
update {
self.extraction_attempts = self.extraction_attempts + 1;
self.turn_phase = TurnPhase::CallingLlm;
}
to Running
emit TurnCheckCompaction
}
transition ExtractionValidationFailedExhausted {
on input ExtractionValidationFailed { error }
guard { self.lifecycle_phase == Phase::Running }
guard "turn_extracting" { self.turn_phase == TurnPhase::Extracting }
guard "retries_exhausted" { self.extraction_attempts >= self.max_extraction_retries }
update {
self.extraction_attempts = self.extraction_attempts + 1;
self.turn_phase = TurnPhase::Completed;
self.terminal_outcome = Some(TurnTerminalOutcome::Completed);
self.terminal_cause_kind = None;
}
to Running
emit TurnRunCompleted {
run_id: self.current_run_id.get("value"),
outcome: TurnTerminalOutcome::Completed
}
}
transition ExtractionFailedTerminal {
on input ExtractionFailed { error }
guard { self.lifecycle_phase == Phase::Running }
guard "turn_extracting_calling_or_draining" {
self.turn_phase == TurnPhase::Extracting
|| self.turn_phase == TurnPhase::CallingLlm
|| self.turn_phase == TurnPhase::DrainingBoundary
}
update {
self.extraction_attempts = self.extraction_attempts + 1;
self.turn_phase = TurnPhase::Completed;
self.terminal_outcome = Some(TurnTerminalOutcome::Completed);
self.terminal_cause_kind = None;
}
to Running
emit TurnRunCompleted {
run_id: self.current_run_id.get("value"),
outcome: TurnTerminalOutcome::Completed
}
}
transition RecoverableFailure {
on input RecoverableFailure {
failure_kind,
retry_attempt,
max_retries,
selected_delay_ms,
error
}
guard { self.lifecycle_phase == Phase::Running }
guard "turn_non_terminal" {
self.turn_phase == TurnPhase::CallingLlm
|| self.turn_phase == TurnPhase::WaitingForOps
|| self.turn_phase == TurnPhase::DrainingBoundary
|| self.turn_phase == TurnPhase::Extracting
}
guard "retry_attempt_present" { retry_attempt > 0 }
update {
self.turn_phase = TurnPhase::ErrorRecovery;
self.llm_retry_attempt = retry_attempt;
self.llm_retry_max_retries = max_retries;
self.llm_retry_selected_delay_ms = selected_delay_ms;
self.llm_retry_last_failure_kind = Some(failure_kind);
}
to Running
}
transition FatalFailure {
on input FatalFailure { terminal_cause_kind, error }
guard { self.lifecycle_phase == Phase::Running }
guard "turn_not_terminal" { self.turn_phase != TurnPhase::Completed && self.turn_phase != TurnPhase::Failed && self.turn_phase != TurnPhase::Cancelled }
guard "terminal_cause_known" { terminal_cause_kind != TurnTerminalCauseKind::Unknown }
update {
self.turn_phase = TurnPhase::Failed;
self.terminal_outcome = Some(TurnTerminalOutcome::Failed);
self.terminal_cause_kind = Some(terminal_cause_kind);
}
to Running
emit TurnRunFailed {
run_id: self.current_run_id.get("value"),
terminal_cause_kind: terminal_cause_kind,
error: error
}
}
transition RetryRequested {
on input RetryRequested { retry_attempt }
guard { self.lifecycle_phase == Phase::Running }
guard "turn_error_recovery" { self.turn_phase == TurnPhase::ErrorRecovery }
guard "retry_attempt_matches" { retry_attempt == self.llm_retry_attempt }
update {
self.turn_phase = TurnPhase::CallingLlm;
}
to Running
emit TurnCheckCompaction
}
transition CancelNow {
on input CancelNow
guard { self.lifecycle_phase == Phase::Running }
guard "turn_cancellable" {
self.turn_phase != TurnPhase::Ready
&& self.turn_phase != TurnPhase::Completed
&& self.turn_phase != TurnPhase::Failed
&& self.turn_phase != TurnPhase::Cancelled
}
update {
self.turn_phase = TurnPhase::Cancelling;
}
to Running
}
transition RequestCancelAfterBoundary {
on input RequestCancelAfterBoundary
guard { self.lifecycle_phase == Phase::Running }
guard "turn_cancellable" {
self.turn_phase != TurnPhase::Ready
&& self.turn_phase != TurnPhase::Completed
&& self.turn_phase != TurnPhase::Failed
&& self.turn_phase != TurnPhase::Cancelled
}
update {
self.cancel_after_boundary = true;
}
to Running
}
transition CancellationObserved {
on input CancellationObserved
guard { self.lifecycle_phase == Phase::Running }
guard "turn_cancelling" { self.turn_phase == TurnPhase::Cancelling }
update {
self.turn_phase = TurnPhase::Cancelled;
self.terminal_outcome = Some(TurnTerminalOutcome::Cancelled);
}
to Running
emit TurnRunCancelled { run_id: self.current_run_id.get("value"), reason: TurnCancellationReason::Observed }
}
transition AcknowledgeTerminal {
on input AcknowledgeTerminal { outcome }
guard { self.lifecycle_phase == Phase::Running }
guard "turn_terminal" {
self.turn_phase == TurnPhase::Completed
|| self.turn_phase == TurnPhase::Failed
|| self.turn_phase == TurnPhase::Cancelled
}
update {
self.turn_phase = TurnPhase::Ready;
self.primitive_kind = None;
self.admitted_content_shape = None;
self.vision_enabled = false;
self.image_tool_results_enabled = false;
self.tool_calls_pending = 0;
self.pending_op_refs = EmptySet;
self.barrier_operation_ids = EmptySet;
self.has_barrier_ops = false;
self.barrier_satisfied = false;
self.boundary_count = 0;
self.cancel_after_boundary = false;
self.terminal_outcome = Some(outcome);
self.terminal_cause_kind = None;
self.extraction_attempts = 0;
self.max_extraction_retries = 0;
self.llm_retry_attempt = 0;
self.llm_retry_max_retries = 0;
self.llm_retry_selected_delay_ms = 0;
self.llm_retry_last_failure_kind = None;
}
to Running
}
transition TurnLimitReached {
on input TurnLimitReached
guard { self.lifecycle_phase == Phase::Running }
guard "turn_not_terminal" { self.turn_phase != TurnPhase::Completed && self.turn_phase != TurnPhase::Failed && self.turn_phase != TurnPhase::Cancelled }
update {
self.turn_phase = TurnPhase::Failed;
self.terminal_outcome = Some(TurnTerminalOutcome::Failed);
self.terminal_cause_kind = Some(TurnTerminalCauseKind::TurnLimitReached);
}
to Running
emit TurnRunFailed {
run_id: self.current_run_id.get("value"),
terminal_cause_kind: TurnTerminalCauseKind::TurnLimitReached,
error: "TurnLimitReached"
}
}
transition BudgetExhausted {
on input BudgetExhausted
guard { self.lifecycle_phase == Phase::Running }
guard "turn_not_terminal" { self.turn_phase != TurnPhase::Completed && self.turn_phase != TurnPhase::Failed && self.turn_phase != TurnPhase::Cancelled }
update {
self.turn_phase = TurnPhase::Failed;
self.terminal_outcome = Some(TurnTerminalOutcome::BudgetExhausted);
self.terminal_cause_kind = Some(TurnTerminalCauseKind::BudgetExhausted);
}
to Running
emit TurnRunFailed {
run_id: self.current_run_id.get("value"),
terminal_cause_kind: TurnTerminalCauseKind::BudgetExhausted,
error: "BudgetExhausted"
}
}
transition TimeBudgetExceeded {
on input TimeBudgetExceeded
guard { self.lifecycle_phase == Phase::Running }
guard "turn_not_terminal" { self.turn_phase != TurnPhase::Completed && self.turn_phase != TurnPhase::Failed && self.turn_phase != TurnPhase::Cancelled }
update {
self.turn_phase = TurnPhase::Failed;
self.terminal_outcome = Some(TurnTerminalOutcome::TimeBudgetExceeded);
self.terminal_cause_kind = Some(TurnTerminalCauseKind::TimeBudgetExceeded);
}
to Running
emit TurnRunFailed {
run_id: self.current_run_id.get("value"),
terminal_cause_kind: TurnTerminalCauseKind::TimeBudgetExceeded,
error: "TimeBudgetExceeded"
}
}
transition ForceCancelNoRun {
on input ForceCancelNoRun
guard { self.lifecycle_phase == Phase::Running }
guard "no_run_bound" { self.current_run_id == None }
guard "turn_ready" { self.turn_phase == TurnPhase::Ready }
update {
self.turn_phase = TurnPhase::Cancelled;
self.terminal_outcome = Some(TurnTerminalOutcome::Cancelled);
}
to Running
}
transition RunCompleted {
on input RunCompleted { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "run_matches_binding" { self.current_run_id == Some(run_id) }
update {
if self.turn_phase != TurnPhase::Completed
&& self.turn_phase != TurnPhase::Failed
&& self.turn_phase != TurnPhase::Cancelled
{
self.turn_phase = TurnPhase::Completed;
self.terminal_outcome = Some(TurnTerminalOutcome::Completed);
}
}
to Running
}
transition ServiceTurnCommittedRunningToIdle {
on input ServiceTurnCommitted { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_idle" { self.pre_run_phase == Some(PreRunPhase::Idle) }
guard "run_matches_binding" { self.current_run_id == Some(run_id) }
guard "turn_completed" { self.turn_phase == TurnPhase::Completed && self.terminal_outcome == Some(TurnTerminalOutcome::Completed) }
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Idle
}
transition ServiceTurnCommittedRunningToAttached {
on input ServiceTurnCommitted { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_attached" { self.pre_run_phase == Some(PreRunPhase::Attached) }
guard "run_matches_binding" { self.current_run_id == Some(run_id) }
guard "turn_completed" { self.turn_phase == TurnPhase::Completed && self.terminal_outcome == Some(TurnTerminalOutcome::Completed) }
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Attached
}
transition ServiceTurnCommittedRunningToRetired {
on input ServiceTurnCommitted { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_retired" { self.pre_run_phase == Some(PreRunPhase::Retired) }
guard "run_matches_binding" { self.current_run_id == Some(run_id) }
guard "turn_completed" { self.turn_phase == TurnPhase::Completed && self.terminal_outcome == Some(TurnTerminalOutcome::Completed) }
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Retired
}
transition RunFailed {
on input RunFailed { run_id, runtime_apply_failure_cause, runtime_apply_failure_message, terminal_outcome, terminal_cause_kind, error }
guard { self.lifecycle_phase == Phase::Running }
guard "run_matches_binding" { self.current_run_id == Some(run_id) }
guard "terminal_cause_known" { terminal_cause_kind != TurnTerminalCauseKind::Unknown }
update {
self.turn_phase = TurnPhase::Failed;
self.terminal_outcome = Some(terminal_outcome);
self.terminal_cause_kind = Some(terminal_cause_kind);
self.last_runtime_apply_failure_cause = runtime_apply_failure_cause;
self.last_runtime_apply_failure_message = runtime_apply_failure_message;
}
to Running
}
transition RunCancelled {
on input RunCancelled { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "run_matches_binding" { self.current_run_id == Some(run_id) }
update {
self.turn_phase = TurnPhase::Cancelled;
self.terminal_outcome = Some(TurnTerminalOutcome::Cancelled);
}
to Running
}
transition SurfaceRegisterAttached {
on input SurfaceRegister { surface_id }
guard { self.lifecycle_phase == Phase::Attached }
update {
self.known_surfaces.insert(surface_id);
}
to Attached
}
transition SurfaceRegisterRunning {
on input SurfaceRegister { surface_id }
guard { self.lifecycle_phase == Phase::Running }
update {
self.known_surfaces.insert(surface_id);
}
to Running
}
transition SurfaceStageAddAttached {
on input SurfaceStageAdd { surface_id, now_ms }
guard { self.lifecycle_phase == Phase::Attached }
guard "surface_operating" { self.surface_phase == SurfacePhase::Operating }
update {
self.known_surfaces.insert(surface_id);
self.surface_staged_op.insert(surface_id, SurfaceStagedOp::Add);
self.reload_staged_surfaces.remove(surface_id);
self.next_staged_intent_sequence = self.next_staged_intent_sequence + 1;
self.surface_staged_intent_sequence.insert(surface_id, self.next_staged_intent_sequence);
}
to Attached
}
transition SurfaceStageAddRunning {
on input SurfaceStageAdd { surface_id, now_ms }
guard { self.lifecycle_phase == Phase::Running }
guard "surface_operating" { self.surface_phase == SurfacePhase::Operating }
update {
self.known_surfaces.insert(surface_id);
self.surface_staged_op.insert(surface_id, SurfaceStagedOp::Add);
self.reload_staged_surfaces.remove(surface_id);
self.next_staged_intent_sequence = self.next_staged_intent_sequence + 1;
self.surface_staged_intent_sequence.insert(surface_id, self.next_staged_intent_sequence);
}
to Running
}
transition SurfaceStageRemoveAttached {
on input SurfaceStageRemove { surface_id, now_ms }
guard { self.lifecycle_phase == Phase::Attached }
guard "surface_operating" { self.surface_phase == SurfacePhase::Operating }
update {
self.known_surfaces.insert(surface_id);
self.surface_staged_op.insert(surface_id, SurfaceStagedOp::Remove);
self.reload_staged_surfaces.remove(surface_id);
self.next_staged_intent_sequence = self.next_staged_intent_sequence + 1;
self.surface_staged_intent_sequence.insert(surface_id, self.next_staged_intent_sequence);
}
to Attached
}
transition SurfaceStageRemoveRunning {
on input SurfaceStageRemove { surface_id, now_ms }
guard { self.lifecycle_phase == Phase::Running }
guard "surface_operating" { self.surface_phase == SurfacePhase::Operating }
update {
self.known_surfaces.insert(surface_id);
self.surface_staged_op.insert(surface_id, SurfaceStagedOp::Remove);
self.reload_staged_surfaces.remove(surface_id);
self.next_staged_intent_sequence = self.next_staged_intent_sequence + 1;
self.surface_staged_intent_sequence.insert(surface_id, self.next_staged_intent_sequence);
}
to Running
}
transition SurfaceStageReloadAttached {
on input SurfaceStageReload { surface_id, now_ms }
guard { self.lifecycle_phase == Phase::Attached }
guard "surface_operating" { self.surface_phase == SurfacePhase::Operating }
guard "surface_active" { self.active_surfaces.contains(surface_id) }
update {
self.known_surfaces.insert(surface_id);
self.surface_staged_op.insert(surface_id, SurfaceStagedOp::Reload);
self.reload_staged_surfaces.insert(surface_id);
self.next_staged_intent_sequence = self.next_staged_intent_sequence + 1;
self.surface_staged_intent_sequence.insert(surface_id, self.next_staged_intent_sequence);
}
to Attached
}
transition SurfaceStageReloadRunning {
on input SurfaceStageReload { surface_id, now_ms }
guard { self.lifecycle_phase == Phase::Running }
guard "surface_operating" { self.surface_phase == SurfacePhase::Operating }
guard "surface_active" { self.active_surfaces.contains(surface_id) }
update {
self.known_surfaces.insert(surface_id);
self.surface_staged_op.insert(surface_id, SurfaceStagedOp::Reload);
self.reload_staged_surfaces.insert(surface_id);
self.next_staged_intent_sequence = self.next_staged_intent_sequence + 1;
self.surface_staged_intent_sequence.insert(surface_id, self.next_staged_intent_sequence);
}
to Running
}
transition SurfaceApplyBoundaryAddAttached {
on input SurfaceApplyBoundary { surface_id, now_ms, staged_intent_sequence, applied_at_turn }
guard { self.lifecycle_phase == Phase::Attached }
guard "surface_operating" { self.surface_phase == SurfacePhase::Operating }
guard "staged_add" { self.surface_staged_op.contains_key(surface_id) && self.surface_staged_op.get(surface_id).get("value") == SurfaceStagedOp::Add }
guard "staged_sequence_matches" { self.surface_staged_intent_sequence.contains_key(surface_id) && self.surface_staged_intent_sequence.get(surface_id).get("value") == staged_intent_sequence }
guard "no_pending_surface_op" {
!self.surface_pending_op.contains_key(surface_id)
|| self.surface_pending_op.get(surface_id).get("value") == SurfacePendingOp::None
}
guard "base_accepts_add" {
!self.surface_base_state.contains_key(surface_id)
|| self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Absent
|| self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Active
|| self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Removed
}
update {
self.known_surfaces.insert(surface_id);
self.next_pending_task_sequence = self.next_pending_task_sequence + 1;
self.surface_pending_op.insert(surface_id, SurfacePendingOp::Add);
self.surface_pending_task_sequence.insert(surface_id, self.next_pending_task_sequence);
self.surface_pending_lineage_sequence.insert(surface_id, staged_intent_sequence);
self.surface_staged_op.remove(surface_id);
self.surface_staged_intent_sequence.remove(surface_id);
self.reload_staged_surfaces.remove(surface_id);
self.surface_last_delta_operation.insert(surface_id, ExternalToolSurfaceDeltaOperation::Add);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Pending);
self.snapshot_epoch = self.snapshot_epoch + 1;
}
to Attached
emit ScheduleSurfaceCompletion {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Add,
pending_task_sequence: self.next_pending_task_sequence,
staged_intent_sequence: staged_intent_sequence,
applied_at_turn: applied_at_turn,
}
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Add,
phase: ExternalToolSurfaceDeltaPhase::Pending,
cause: None,
}
}
transition SurfaceApplyBoundaryAddRunning {
on input SurfaceApplyBoundary { surface_id, now_ms, staged_intent_sequence, applied_at_turn }
guard { self.lifecycle_phase == Phase::Running }
guard "surface_operating" { self.surface_phase == SurfacePhase::Operating }
guard "staged_add" { self.surface_staged_op.contains_key(surface_id) && self.surface_staged_op.get(surface_id).get("value") == SurfaceStagedOp::Add }
guard "staged_sequence_matches" { self.surface_staged_intent_sequence.contains_key(surface_id) && self.surface_staged_intent_sequence.get(surface_id).get("value") == staged_intent_sequence }
guard "no_pending_surface_op" {
!self.surface_pending_op.contains_key(surface_id)
|| self.surface_pending_op.get(surface_id).get("value") == SurfacePendingOp::None
}
guard "base_accepts_add" {
!self.surface_base_state.contains_key(surface_id)
|| self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Absent
|| self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Active
|| self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Removed
}
update {
self.known_surfaces.insert(surface_id);
self.next_pending_task_sequence = self.next_pending_task_sequence + 1;
self.surface_pending_op.insert(surface_id, SurfacePendingOp::Add);
self.surface_pending_task_sequence.insert(surface_id, self.next_pending_task_sequence);
self.surface_pending_lineage_sequence.insert(surface_id, staged_intent_sequence);
self.surface_staged_op.remove(surface_id);
self.surface_staged_intent_sequence.remove(surface_id);
self.reload_staged_surfaces.remove(surface_id);
self.surface_last_delta_operation.insert(surface_id, ExternalToolSurfaceDeltaOperation::Add);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Pending);
self.snapshot_epoch = self.snapshot_epoch + 1;
}
to Running
emit ScheduleSurfaceCompletion {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Add,
pending_task_sequence: self.next_pending_task_sequence,
staged_intent_sequence: staged_intent_sequence,
applied_at_turn: applied_at_turn,
}
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Add,
phase: ExternalToolSurfaceDeltaPhase::Pending,
cause: None,
}
}
transition SurfaceApplyBoundaryReloadAttached {
on input SurfaceApplyBoundary { surface_id, now_ms, staged_intent_sequence, applied_at_turn }
guard { self.lifecycle_phase == Phase::Attached }
guard "surface_operating" { self.surface_phase == SurfacePhase::Operating }
guard "staged_reload" { self.surface_staged_op.contains_key(surface_id) && self.surface_staged_op.get(surface_id).get("value") == SurfaceStagedOp::Reload }
guard "staged_sequence_matches" { self.surface_staged_intent_sequence.contains_key(surface_id) && self.surface_staged_intent_sequence.get(surface_id).get("value") == staged_intent_sequence }
guard "surface_active" { self.active_surfaces.contains(surface_id) }
guard "base_active" { self.surface_base_state.contains_key(surface_id) && self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Active }
guard "no_pending_surface_op" {
!self.surface_pending_op.contains_key(surface_id)
|| self.surface_pending_op.get(surface_id).get("value") == SurfacePendingOp::None
}
update {
self.known_surfaces.insert(surface_id);
self.next_pending_task_sequence = self.next_pending_task_sequence + 1;
self.surface_pending_op.insert(surface_id, SurfacePendingOp::Reload);
self.surface_pending_task_sequence.insert(surface_id, self.next_pending_task_sequence);
self.surface_pending_lineage_sequence.insert(surface_id, staged_intent_sequence);
self.surface_staged_op.remove(surface_id);
self.surface_staged_intent_sequence.remove(surface_id);
self.reload_staged_surfaces.remove(surface_id);
self.surface_last_delta_operation.insert(surface_id, ExternalToolSurfaceDeltaOperation::Reload);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Pending);
self.snapshot_epoch = self.snapshot_epoch + 1;
}
to Attached
emit ScheduleSurfaceCompletion {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Reload,
pending_task_sequence: self.next_pending_task_sequence,
staged_intent_sequence: staged_intent_sequence,
applied_at_turn: applied_at_turn,
}
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Reload,
phase: ExternalToolSurfaceDeltaPhase::Pending,
cause: None,
}
}
transition SurfaceApplyBoundaryReloadRunning {
on input SurfaceApplyBoundary { surface_id, now_ms, staged_intent_sequence, applied_at_turn }
guard { self.lifecycle_phase == Phase::Running }
guard "surface_operating" { self.surface_phase == SurfacePhase::Operating }
guard "staged_reload" { self.surface_staged_op.contains_key(surface_id) && self.surface_staged_op.get(surface_id).get("value") == SurfaceStagedOp::Reload }
guard "staged_sequence_matches" { self.surface_staged_intent_sequence.contains_key(surface_id) && self.surface_staged_intent_sequence.get(surface_id).get("value") == staged_intent_sequence }
guard "surface_active" { self.active_surfaces.contains(surface_id) }
guard "base_active" { self.surface_base_state.contains_key(surface_id) && self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Active }
guard "no_pending_surface_op" {
!self.surface_pending_op.contains_key(surface_id)
|| self.surface_pending_op.get(surface_id).get("value") == SurfacePendingOp::None
}
update {
self.known_surfaces.insert(surface_id);
self.next_pending_task_sequence = self.next_pending_task_sequence + 1;
self.surface_pending_op.insert(surface_id, SurfacePendingOp::Reload);
self.surface_pending_task_sequence.insert(surface_id, self.next_pending_task_sequence);
self.surface_pending_lineage_sequence.insert(surface_id, staged_intent_sequence);
self.surface_staged_op.remove(surface_id);
self.surface_staged_intent_sequence.remove(surface_id);
self.reload_staged_surfaces.remove(surface_id);
self.surface_last_delta_operation.insert(surface_id, ExternalToolSurfaceDeltaOperation::Reload);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Pending);
self.snapshot_epoch = self.snapshot_epoch + 1;
}
to Running
emit ScheduleSurfaceCompletion {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Reload,
pending_task_sequence: self.next_pending_task_sequence,
staged_intent_sequence: staged_intent_sequence,
applied_at_turn: applied_at_turn,
}
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Reload,
phase: ExternalToolSurfaceDeltaPhase::Pending,
cause: None,
}
}
transition SurfaceApplyBoundaryRemoveDrainingAttached {
on input SurfaceApplyBoundary { surface_id, now_ms, staged_intent_sequence, applied_at_turn }
guard { self.lifecycle_phase == Phase::Attached }
guard "surface_operating" { self.surface_phase == SurfacePhase::Operating }
guard "staged_remove" { self.surface_staged_op.contains_key(surface_id) && self.surface_staged_op.get(surface_id).get("value") == SurfaceStagedOp::Remove }
guard "staged_sequence_matches" { self.surface_staged_intent_sequence.contains_key(surface_id) && self.surface_staged_intent_sequence.get(surface_id).get("value") == staged_intent_sequence }
guard "base_active" { self.surface_base_state.contains_key(surface_id) && self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Active }
guard "no_pending_surface_op" {
!self.surface_pending_op.contains_key(surface_id)
|| self.surface_pending_op.get(surface_id).get("value") == SurfacePendingOp::None
}
update {
self.known_surfaces.insert(surface_id);
self.surface_pending_op.insert(surface_id, SurfacePendingOp::None);
self.surface_pending_task_sequence.insert(surface_id, 0);
self.surface_pending_lineage_sequence.insert(surface_id, 0);
self.surface_staged_op.remove(surface_id);
self.surface_staged_intent_sequence.remove(surface_id);
self.reload_staged_surfaces.remove(surface_id);
self.surface_base_state.insert(surface_id, ExternalToolSurfaceBaseState::Removing);
self.active_surfaces.remove(surface_id);
self.visible_surfaces.remove(surface_id);
self.surface_draining_since_ms.insert(surface_id, now_ms);
self.surface_removal_timeout_at_ms.insert(surface_id, now_ms + self.removal_timeout_ms);
self.surface_removal_applied_at_turn.insert(surface_id, applied_at_turn);
self.surface_last_delta_operation.insert(surface_id, ExternalToolSurfaceDeltaOperation::Remove);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Draining);
self.snapshot_epoch = self.snapshot_epoch + 1;
}
to Attached
emit RefreshVisibleSurfaceSet { snapshot_epoch: self.snapshot_epoch }
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Remove,
phase: ExternalToolSurfaceDeltaPhase::Draining,
cause: None,
}
}
transition SurfaceApplyBoundaryRemoveDrainingRunning {
on input SurfaceApplyBoundary { surface_id, now_ms, staged_intent_sequence, applied_at_turn }
guard { self.lifecycle_phase == Phase::Running }
guard "surface_operating" { self.surface_phase == SurfacePhase::Operating }
guard "staged_remove" { self.surface_staged_op.contains_key(surface_id) && self.surface_staged_op.get(surface_id).get("value") == SurfaceStagedOp::Remove }
guard "staged_sequence_matches" { self.surface_staged_intent_sequence.contains_key(surface_id) && self.surface_staged_intent_sequence.get(surface_id).get("value") == staged_intent_sequence }
guard "base_active" { self.surface_base_state.contains_key(surface_id) && self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Active }
guard "no_pending_surface_op" {
!self.surface_pending_op.contains_key(surface_id)
|| self.surface_pending_op.get(surface_id).get("value") == SurfacePendingOp::None
}
update {
self.known_surfaces.insert(surface_id);
self.surface_pending_op.insert(surface_id, SurfacePendingOp::None);
self.surface_pending_task_sequence.insert(surface_id, 0);
self.surface_pending_lineage_sequence.insert(surface_id, 0);
self.surface_staged_op.remove(surface_id);
self.surface_staged_intent_sequence.remove(surface_id);
self.reload_staged_surfaces.remove(surface_id);
self.surface_base_state.insert(surface_id, ExternalToolSurfaceBaseState::Removing);
self.active_surfaces.remove(surface_id);
self.visible_surfaces.remove(surface_id);
self.surface_draining_since_ms.insert(surface_id, now_ms);
self.surface_removal_timeout_at_ms.insert(surface_id, now_ms + self.removal_timeout_ms);
self.surface_removal_applied_at_turn.insert(surface_id, applied_at_turn);
self.surface_last_delta_operation.insert(surface_id, ExternalToolSurfaceDeltaOperation::Remove);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Draining);
self.snapshot_epoch = self.snapshot_epoch + 1;
}
to Running
emit RefreshVisibleSurfaceSet { snapshot_epoch: self.snapshot_epoch }
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Remove,
phase: ExternalToolSurfaceDeltaPhase::Draining,
cause: None,
}
}
transition SurfaceApplyBoundaryRemoveNoopAttached {
on input SurfaceApplyBoundary { surface_id, now_ms, staged_intent_sequence, applied_at_turn }
guard { self.lifecycle_phase == Phase::Attached }
guard "surface_operating" { self.surface_phase == SurfacePhase::Operating }
guard "staged_remove" { self.surface_staged_op.contains_key(surface_id) && self.surface_staged_op.get(surface_id).get("value") == SurfaceStagedOp::Remove }
guard "staged_sequence_matches" { self.surface_staged_intent_sequence.contains_key(surface_id) && self.surface_staged_intent_sequence.get(surface_id).get("value") == staged_intent_sequence }
guard "base_not_active" {
!self.surface_base_state.contains_key(surface_id)
|| self.surface_base_state.get(surface_id).get("value") != ExternalToolSurfaceBaseState::Active
}
guard "no_pending_surface_op" {
!self.surface_pending_op.contains_key(surface_id)
|| self.surface_pending_op.get(surface_id).get("value") == SurfacePendingOp::None
}
update {
self.known_surfaces.insert(surface_id);
self.surface_pending_op.insert(surface_id, SurfacePendingOp::None);
self.surface_pending_task_sequence.insert(surface_id, 0);
self.surface_pending_lineage_sequence.insert(surface_id, 0);
self.surface_staged_op.remove(surface_id);
self.surface_staged_intent_sequence.remove(surface_id);
self.reload_staged_surfaces.remove(surface_id);
}
to Attached
}
transition SurfaceApplyBoundaryRemoveNoopRunning {
on input SurfaceApplyBoundary { surface_id, now_ms, staged_intent_sequence, applied_at_turn }
guard { self.lifecycle_phase == Phase::Running }
guard "surface_operating" { self.surface_phase == SurfacePhase::Operating }
guard "staged_remove" { self.surface_staged_op.contains_key(surface_id) && self.surface_staged_op.get(surface_id).get("value") == SurfaceStagedOp::Remove }
guard "staged_sequence_matches" { self.surface_staged_intent_sequence.contains_key(surface_id) && self.surface_staged_intent_sequence.get(surface_id).get("value") == staged_intent_sequence }
guard "base_not_active" {
!self.surface_base_state.contains_key(surface_id)
|| self.surface_base_state.get(surface_id).get("value") != ExternalToolSurfaceBaseState::Active
}
guard "no_pending_surface_op" {
!self.surface_pending_op.contains_key(surface_id)
|| self.surface_pending_op.get(surface_id).get("value") == SurfacePendingOp::None
}
update {
self.known_surfaces.insert(surface_id);
self.surface_pending_op.insert(surface_id, SurfacePendingOp::None);
self.surface_pending_task_sequence.insert(surface_id, 0);
self.surface_pending_lineage_sequence.insert(surface_id, 0);
self.surface_staged_op.remove(surface_id);
self.surface_staged_intent_sequence.remove(surface_id);
self.reload_staged_surfaces.remove(surface_id);
}
to Running
}
transition SurfaceMarkPendingSucceededAddAttached {
on input SurfaceMarkPendingSucceeded { surface_id, pending_task_sequence, staged_intent_sequence }
guard { self.lifecycle_phase == Phase::Attached }
guard "pending_add" { self.surface_pending_op.contains_key(surface_id) && self.surface_pending_op.get(surface_id).get("value") == SurfacePendingOp::Add }
guard "pending_sequence_matches" { self.surface_pending_task_sequence.contains_key(surface_id) && self.surface_pending_task_sequence.get(surface_id).get("value") == pending_task_sequence }
guard "pending_lineage_matches" { self.surface_pending_lineage_sequence.contains_key(surface_id) && self.surface_pending_lineage_sequence.get(surface_id).get("value") == staged_intent_sequence }
update {
self.known_surfaces.insert(surface_id);
self.surface_pending_op.insert(surface_id, SurfacePendingOp::None);
self.surface_pending_task_sequence.insert(surface_id, 0);
self.surface_pending_lineage_sequence.insert(surface_id, 0);
self.surface_base_state.insert(surface_id, ExternalToolSurfaceBaseState::Active);
self.active_surfaces.insert(surface_id);
self.visible_surfaces.insert(surface_id);
self.surface_last_delta_operation.insert(surface_id, ExternalToolSurfaceDeltaOperation::Add);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Applied);
self.snapshot_epoch = self.snapshot_epoch + 1;
}
to Attached
emit RefreshVisibleSurfaceSet { snapshot_epoch: self.snapshot_epoch }
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Add,
phase: ExternalToolSurfaceDeltaPhase::Applied,
cause: None,
}
}
transition SurfaceMarkPendingSucceededAddRunning {
on input SurfaceMarkPendingSucceeded { surface_id, pending_task_sequence, staged_intent_sequence }
guard { self.lifecycle_phase == Phase::Running }
guard "pending_add" { self.surface_pending_op.contains_key(surface_id) && self.surface_pending_op.get(surface_id).get("value") == SurfacePendingOp::Add }
guard "pending_sequence_matches" { self.surface_pending_task_sequence.contains_key(surface_id) && self.surface_pending_task_sequence.get(surface_id).get("value") == pending_task_sequence }
guard "pending_lineage_matches" { self.surface_pending_lineage_sequence.contains_key(surface_id) && self.surface_pending_lineage_sequence.get(surface_id).get("value") == staged_intent_sequence }
update {
self.known_surfaces.insert(surface_id);
self.surface_pending_op.insert(surface_id, SurfacePendingOp::None);
self.surface_pending_task_sequence.insert(surface_id, 0);
self.surface_pending_lineage_sequence.insert(surface_id, 0);
self.surface_base_state.insert(surface_id, ExternalToolSurfaceBaseState::Active);
self.active_surfaces.insert(surface_id);
self.visible_surfaces.insert(surface_id);
self.surface_last_delta_operation.insert(surface_id, ExternalToolSurfaceDeltaOperation::Add);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Applied);
self.snapshot_epoch = self.snapshot_epoch + 1;
}
to Running
emit RefreshVisibleSurfaceSet { snapshot_epoch: self.snapshot_epoch }
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Add,
phase: ExternalToolSurfaceDeltaPhase::Applied,
cause: None,
}
}
transition SurfaceMarkPendingSucceededReloadAttached {
on input SurfaceMarkPendingSucceeded { surface_id, pending_task_sequence, staged_intent_sequence }
guard { self.lifecycle_phase == Phase::Attached }
guard "pending_reload" { self.surface_pending_op.contains_key(surface_id) && self.surface_pending_op.get(surface_id).get("value") == SurfacePendingOp::Reload }
guard "pending_sequence_matches" { self.surface_pending_task_sequence.contains_key(surface_id) && self.surface_pending_task_sequence.get(surface_id).get("value") == pending_task_sequence }
guard "pending_lineage_matches" { self.surface_pending_lineage_sequence.contains_key(surface_id) && self.surface_pending_lineage_sequence.get(surface_id).get("value") == staged_intent_sequence }
update {
self.known_surfaces.insert(surface_id);
self.surface_pending_op.insert(surface_id, SurfacePendingOp::None);
self.surface_pending_task_sequence.insert(surface_id, 0);
self.surface_pending_lineage_sequence.insert(surface_id, 0);
self.surface_base_state.insert(surface_id, ExternalToolSurfaceBaseState::Active);
self.active_surfaces.insert(surface_id);
self.visible_surfaces.insert(surface_id);
self.surface_last_delta_operation.insert(surface_id, ExternalToolSurfaceDeltaOperation::Reload);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Applied);
self.snapshot_epoch = self.snapshot_epoch + 1;
}
to Attached
emit RefreshVisibleSurfaceSet { snapshot_epoch: self.snapshot_epoch }
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Reload,
phase: ExternalToolSurfaceDeltaPhase::Applied,
cause: None,
}
}
transition SurfaceMarkPendingSucceededReloadRunning {
on input SurfaceMarkPendingSucceeded { surface_id, pending_task_sequence, staged_intent_sequence }
guard { self.lifecycle_phase == Phase::Running }
guard "pending_reload" { self.surface_pending_op.contains_key(surface_id) && self.surface_pending_op.get(surface_id).get("value") == SurfacePendingOp::Reload }
guard "pending_sequence_matches" { self.surface_pending_task_sequence.contains_key(surface_id) && self.surface_pending_task_sequence.get(surface_id).get("value") == pending_task_sequence }
guard "pending_lineage_matches" { self.surface_pending_lineage_sequence.contains_key(surface_id) && self.surface_pending_lineage_sequence.get(surface_id).get("value") == staged_intent_sequence }
update {
self.known_surfaces.insert(surface_id);
self.surface_pending_op.insert(surface_id, SurfacePendingOp::None);
self.surface_pending_task_sequence.insert(surface_id, 0);
self.surface_pending_lineage_sequence.insert(surface_id, 0);
self.surface_base_state.insert(surface_id, ExternalToolSurfaceBaseState::Active);
self.active_surfaces.insert(surface_id);
self.visible_surfaces.insert(surface_id);
self.surface_last_delta_operation.insert(surface_id, ExternalToolSurfaceDeltaOperation::Reload);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Applied);
self.snapshot_epoch = self.snapshot_epoch + 1;
}
to Running
emit RefreshVisibleSurfaceSet { snapshot_epoch: self.snapshot_epoch }
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Reload,
phase: ExternalToolSurfaceDeltaPhase::Applied,
cause: None,
}
}
transition SurfaceMarkPendingFailedAttached {
on input SurfaceMarkPendingFailed { surface_id, pending_task_sequence, staged_intent_sequence, cause }
guard { self.lifecycle_phase == Phase::Attached }
guard "pending_sequence_matches" { self.surface_pending_task_sequence.contains_key(surface_id) && self.surface_pending_task_sequence.get(surface_id).get("value") == pending_task_sequence }
guard "pending_lineage_matches" { self.surface_pending_lineage_sequence.contains_key(surface_id) && self.surface_pending_lineage_sequence.get(surface_id).get("value") == staged_intent_sequence }
update {
self.surface_pending_op.insert(surface_id, SurfacePendingOp::None);
self.surface_pending_task_sequence.insert(surface_id, 0);
self.surface_pending_lineage_sequence.insert(surface_id, 0);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Failed);
}
to Attached
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: self.surface_last_delta_operation.get(surface_id).get("value"),
phase: ExternalToolSurfaceDeltaPhase::Failed,
cause: Some(cause),
}
}
transition SurfaceMarkPendingFailedRunning {
on input SurfaceMarkPendingFailed { surface_id, pending_task_sequence, staged_intent_sequence, cause }
guard { self.lifecycle_phase == Phase::Running }
guard "pending_sequence_matches" { self.surface_pending_task_sequence.contains_key(surface_id) && self.surface_pending_task_sequence.get(surface_id).get("value") == pending_task_sequence }
guard "pending_lineage_matches" { self.surface_pending_lineage_sequence.contains_key(surface_id) && self.surface_pending_lineage_sequence.get(surface_id).get("value") == staged_intent_sequence }
update {
self.surface_pending_op.insert(surface_id, SurfacePendingOp::None);
self.surface_pending_task_sequence.insert(surface_id, 0);
self.surface_pending_lineage_sequence.insert(surface_id, 0);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Failed);
}
to Running
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: self.surface_last_delta_operation.get(surface_id).get("value"),
phase: ExternalToolSurfaceDeltaPhase::Failed,
cause: Some(cause),
}
}
transition SurfaceCallStartedActiveAttached {
on input SurfaceCallStarted { surface_id }
guard { self.lifecycle_phase == Phase::Attached }
guard "surface_active" { self.surface_base_state.contains_key(surface_id) && self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Active }
update {
self.surface_inflight_calls.increment(surface_id, 1);
}
to Attached
}
transition SurfaceCallStartedActiveRunning {
on input SurfaceCallStarted { surface_id }
guard { self.lifecycle_phase == Phase::Running }
guard "surface_active" { self.surface_base_state.contains_key(surface_id) && self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Active }
update {
self.surface_inflight_calls.increment(surface_id, 1);
}
to Running
}
transition SurfaceCallStartedRejectRemovingAttached {
on input SurfaceCallStarted { surface_id }
guard { self.lifecycle_phase == Phase::Attached }
guard "surface_removing" { self.surface_base_state.contains_key(surface_id) && self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Removing }
update {}
to Attached
emit RejectSurfaceCall { surface_id: surface_id, cause: ExternalToolSurfaceFailureCause::SurfaceDraining }
}
transition SurfaceCallStartedRejectRemovingRunning {
on input SurfaceCallStarted { surface_id }
guard { self.lifecycle_phase == Phase::Running }
guard "surface_removing" { self.surface_base_state.contains_key(surface_id) && self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Removing }
update {}
to Running
emit RejectSurfaceCall { surface_id: surface_id, cause: ExternalToolSurfaceFailureCause::SurfaceDraining }
}
transition SurfaceCallStartedRejectUnavailableAttached {
on input SurfaceCallStarted { surface_id }
guard { self.lifecycle_phase == Phase::Attached }
guard "surface_unavailable" {
!self.surface_base_state.contains_key(surface_id)
|| (
self.surface_base_state.get(surface_id).get("value") != ExternalToolSurfaceBaseState::Active
&& self.surface_base_state.get(surface_id).get("value") != ExternalToolSurfaceBaseState::Removing
)
}
update {}
to Attached
emit RejectSurfaceCall { surface_id: surface_id, cause: ExternalToolSurfaceFailureCause::SurfaceUnavailable }
}
transition SurfaceCallStartedRejectUnavailableRunning {
on input SurfaceCallStarted { surface_id }
guard { self.lifecycle_phase == Phase::Running }
guard "surface_unavailable" {
!self.surface_base_state.contains_key(surface_id)
|| (
self.surface_base_state.get(surface_id).get("value") != ExternalToolSurfaceBaseState::Active
&& self.surface_base_state.get(surface_id).get("value") != ExternalToolSurfaceBaseState::Removing
)
}
update {}
to Running
emit RejectSurfaceCall { surface_id: surface_id, cause: ExternalToolSurfaceFailureCause::SurfaceUnavailable }
}
transition SurfaceCallFinishedAttached {
on input SurfaceCallFinished { surface_id }
guard { self.lifecycle_phase == Phase::Attached }
guard "surface_active_or_removing" {
self.surface_base_state.contains_key(surface_id)
&& (
self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Active
|| self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Removing
)
}
guard "inflight_calls_remain" { self.surface_inflight_calls.contains_key(surface_id) && self.surface_inflight_calls.get(surface_id).get("value") > 0 }
update {
self.surface_inflight_calls.insert(surface_id, self.surface_inflight_calls.get(surface_id).get("value") - 1);
}
to Attached
}
transition SurfaceCallFinishedRunning {
on input SurfaceCallFinished { surface_id }
guard { self.lifecycle_phase == Phase::Running }
guard "surface_active_or_removing" {
self.surface_base_state.contains_key(surface_id)
&& (
self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Active
|| self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Removing
)
}
guard "inflight_calls_remain" { self.surface_inflight_calls.contains_key(surface_id) && self.surface_inflight_calls.get(surface_id).get("value") > 0 }
update {
self.surface_inflight_calls.insert(surface_id, self.surface_inflight_calls.get(surface_id).get("value") - 1);
}
to Running
}
transition SurfaceFinalizeRemovalCleanAttached {
on input SurfaceFinalizeRemovalClean { surface_id }
guard { self.lifecycle_phase == Phase::Attached }
guard "surface_removing" { self.surface_base_state.contains_key(surface_id) && self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Removing }
guard "no_inflight_calls_remain" {
!self.surface_inflight_calls.contains_key(surface_id)
|| self.surface_inflight_calls.get(surface_id).get("value") == 0
}
update {
self.surface_base_state.insert(surface_id, ExternalToolSurfaceBaseState::Removed);
self.active_surfaces.remove(surface_id);
self.visible_surfaces.remove(surface_id);
self.surface_pending_op.insert(surface_id, SurfacePendingOp::None);
self.surface_pending_task_sequence.insert(surface_id, 0);
self.surface_pending_lineage_sequence.insert(surface_id, 0);
self.surface_draining_since_ms.remove(surface_id);
self.surface_removal_timeout_at_ms.remove(surface_id);
self.surface_removal_applied_at_turn.remove(surface_id);
self.surface_last_delta_operation.insert(surface_id, ExternalToolSurfaceDeltaOperation::Remove);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Applied);
self.snapshot_epoch = self.snapshot_epoch + 1;
}
to Attached
emit CloseSurfaceConnection { surface_id: surface_id }
emit RefreshVisibleSurfaceSet { snapshot_epoch: self.snapshot_epoch }
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Remove,
phase: ExternalToolSurfaceDeltaPhase::Applied,
cause: None,
}
}
transition SurfaceFinalizeRemovalCleanRunning {
on input SurfaceFinalizeRemovalClean { surface_id }
guard { self.lifecycle_phase == Phase::Running }
guard "surface_removing" { self.surface_base_state.contains_key(surface_id) && self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Removing }
guard "no_inflight_calls_remain" {
!self.surface_inflight_calls.contains_key(surface_id)
|| self.surface_inflight_calls.get(surface_id).get("value") == 0
}
update {
self.surface_base_state.insert(surface_id, ExternalToolSurfaceBaseState::Removed);
self.active_surfaces.remove(surface_id);
self.visible_surfaces.remove(surface_id);
self.surface_pending_op.insert(surface_id, SurfacePendingOp::None);
self.surface_pending_task_sequence.insert(surface_id, 0);
self.surface_pending_lineage_sequence.insert(surface_id, 0);
self.surface_draining_since_ms.remove(surface_id);
self.surface_removal_timeout_at_ms.remove(surface_id);
self.surface_removal_applied_at_turn.remove(surface_id);
self.surface_last_delta_operation.insert(surface_id, ExternalToolSurfaceDeltaOperation::Remove);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Applied);
self.snapshot_epoch = self.snapshot_epoch + 1;
}
to Running
emit CloseSurfaceConnection { surface_id: surface_id }
emit RefreshVisibleSurfaceSet { snapshot_epoch: self.snapshot_epoch }
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Remove,
phase: ExternalToolSurfaceDeltaPhase::Applied,
cause: None,
}
}
transition SurfaceFinalizeRemovalForcedAttached {
on input SurfaceFinalizeRemovalForced { surface_id }
guard { self.lifecycle_phase == Phase::Attached }
guard "surface_removing" { self.surface_base_state.contains_key(surface_id) && self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Removing }
update {
self.surface_base_state.insert(surface_id, ExternalToolSurfaceBaseState::Removed);
self.active_surfaces.remove(surface_id);
self.visible_surfaces.remove(surface_id);
self.surface_pending_op.insert(surface_id, SurfacePendingOp::None);
self.surface_pending_task_sequence.insert(surface_id, 0);
self.surface_pending_lineage_sequence.insert(surface_id, 0);
self.surface_inflight_calls.insert(surface_id, 0);
self.surface_draining_since_ms.remove(surface_id);
self.surface_removal_timeout_at_ms.remove(surface_id);
self.surface_removal_applied_at_turn.remove(surface_id);
self.surface_last_delta_operation.insert(surface_id, ExternalToolSurfaceDeltaOperation::Remove);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Forced);
self.snapshot_epoch = self.snapshot_epoch + 1;
}
to Attached
emit CloseSurfaceConnection { surface_id: surface_id }
emit RefreshVisibleSurfaceSet { snapshot_epoch: self.snapshot_epoch }
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Remove,
phase: ExternalToolSurfaceDeltaPhase::Forced,
cause: None,
}
}
transition SurfaceFinalizeRemovalForcedRunning {
on input SurfaceFinalizeRemovalForced { surface_id }
guard { self.lifecycle_phase == Phase::Running }
guard "surface_removing" { self.surface_base_state.contains_key(surface_id) && self.surface_base_state.get(surface_id).get("value") == ExternalToolSurfaceBaseState::Removing }
update {
self.surface_base_state.insert(surface_id, ExternalToolSurfaceBaseState::Removed);
self.active_surfaces.remove(surface_id);
self.visible_surfaces.remove(surface_id);
self.surface_pending_op.insert(surface_id, SurfacePendingOp::None);
self.surface_pending_task_sequence.insert(surface_id, 0);
self.surface_pending_lineage_sequence.insert(surface_id, 0);
self.surface_inflight_calls.insert(surface_id, 0);
self.surface_draining_since_ms.remove(surface_id);
self.surface_removal_timeout_at_ms.remove(surface_id);
self.surface_removal_applied_at_turn.remove(surface_id);
self.surface_last_delta_operation.insert(surface_id, ExternalToolSurfaceDeltaOperation::Remove);
self.surface_last_delta_phase.insert(surface_id, ExternalToolSurfaceDeltaPhase::Forced);
self.snapshot_epoch = self.snapshot_epoch + 1;
}
to Running
emit CloseSurfaceConnection { surface_id: surface_id }
emit RefreshVisibleSurfaceSet { snapshot_epoch: self.snapshot_epoch }
emit EmitExternalToolDelta {
surface_id: surface_id,
operation: ExternalToolSurfaceDeltaOperation::Remove,
phase: ExternalToolSurfaceDeltaPhase::Forced,
cause: None,
}
}
transition SurfaceSnapshotAlignedAttached {
on input SurfaceSnapshotAligned { epoch }
guard { self.lifecycle_phase == Phase::Attached }
update {
self.snapshot_aligned_epoch = epoch;
}
to Attached
}
transition SurfaceSnapshotAlignedRunning {
on input SurfaceSnapshotAligned { epoch }
guard { self.lifecycle_phase == Phase::Running }
update {
self.snapshot_aligned_epoch = epoch;
}
to Running
}
transition SurfaceShutdownAttached {
on input SurfaceShutdown
guard { self.lifecycle_phase == Phase::Attached }
update {
self.surface_phase = SurfacePhase::Shutdown;
}
to Attached
}
transition SurfaceShutdownRunning {
on input SurfaceShutdown
guard { self.lifecycle_phase == Phase::Running }
update {
self.surface_phase = SurfacePhase::Shutdown;
}
to Running
}
transition CommitRunningToIdle {
on input Commit { input_id, run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_idle" { self.pre_run_phase == Some(PreRunPhase::Idle) }
guard "current_run_id_matches_binding" { self.current_run_id == Some(run_id) }
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Idle
}
transition CommitRunningToAttached {
on input Commit { input_id, run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_attached" { self.pre_run_phase == Some(PreRunPhase::Attached) }
guard "current_run_id_matches_binding" { self.current_run_id == Some(run_id) }
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Attached
}
transition CommitRunningToRetired {
on input Commit { input_id, run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_retired" { self.pre_run_phase == Some(PreRunPhase::Retired) }
guard "current_run_id_matches_binding" { self.current_run_id == Some(run_id) }
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Retired
}
transition FailRunningToIdle {
on input Fail { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_idle" { self.pre_run_phase == Some(PreRunPhase::Idle) }
guard "current_run_id_matches_binding" { self.current_run_id == Some(run_id) }
guard "turn_failed_with_cause" {
self.turn_phase == TurnPhase::Failed
&& self.terminal_cause_kind != None
&& self.terminal_cause_kind != Some(TurnTerminalCauseKind::Unknown)
}
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Idle
emit RecordTerminalOutcome
}
transition FailRunningToAttached {
on input Fail { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_attached" { self.pre_run_phase == Some(PreRunPhase::Attached) }
guard "current_run_id_matches_binding" { self.current_run_id == Some(run_id) }
guard "turn_failed_with_cause" {
self.turn_phase == TurnPhase::Failed
&& self.terminal_cause_kind != None
&& self.terminal_cause_kind != Some(TurnTerminalCauseKind::Unknown)
}
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Attached
emit RecordTerminalOutcome
}
transition FailRunningToRetired {
on input Fail { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_retired" { self.pre_run_phase == Some(PreRunPhase::Retired) }
guard "current_run_id_matches_binding" { self.current_run_id == Some(run_id) }
guard "turn_failed_with_cause" {
self.turn_phase == TurnPhase::Failed
&& self.terminal_cause_kind != None
&& self.terminal_cause_kind != Some(TurnTerminalCauseKind::Unknown)
}
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Retired
emit RecordTerminalOutcome
}
transition CancelRunningToIdle {
on input CancelRun { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_idle" { self.pre_run_phase == Some(PreRunPhase::Idle) }
guard "current_run_id_matches_binding" { self.current_run_id == Some(run_id) }
guard "turn_cancelled" {
self.turn_phase == TurnPhase::Cancelled
&& self.terminal_outcome == Some(TurnTerminalOutcome::Cancelled)
}
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Idle
emit RecordTerminalOutcome
}
transition CancelRunningToAttached {
on input CancelRun { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_attached" { self.pre_run_phase == Some(PreRunPhase::Attached) }
guard "current_run_id_matches_binding" { self.current_run_id == Some(run_id) }
guard "turn_cancelled" {
self.turn_phase == TurnPhase::Cancelled
&& self.terminal_outcome == Some(TurnTerminalOutcome::Cancelled)
}
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Attached
emit RecordTerminalOutcome
}
transition CancelRunningToRetired {
on input CancelRun { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_retired" { self.pre_run_phase == Some(PreRunPhase::Retired) }
guard "current_run_id_matches_binding" { self.current_run_id == Some(run_id) }
guard "turn_cancelled" {
self.turn_phase == TurnPhase::Cancelled
&& self.terminal_outcome == Some(TurnTerminalOutcome::Cancelled)
}
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Retired
emit RecordTerminalOutcome
}
transition RollbackRunRunningToIdle {
on input RollbackRun { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_idle" { self.pre_run_phase == Some(PreRunPhase::Idle) }
guard "current_run_id_matches_binding" { self.current_run_id == Some(run_id) }
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Idle
}
transition RollbackRunRunningToAttached {
on input RollbackRun { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_attached" { self.pre_run_phase == Some(PreRunPhase::Attached) }
guard "current_run_id_matches_binding" { self.current_run_id == Some(run_id) }
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Attached
}
transition RollbackRunRunningToRetired {
on input RollbackRun { run_id }
guard { self.lifecycle_phase == Phase::Running }
guard "pre_run_phase_matches_retired" { self.pre_run_phase == Some(PreRunPhase::Retired) }
guard "current_run_id_matches_binding" { self.current_run_id == Some(run_id) }
update {
self.current_run_id = None;
self.pre_run_phase = None;
}
to Retired
}
transition RecycleFromIdleOrRetired {
on input Recycle
guard {
self.lifecycle_phase == Phase::Idle || self.lifecycle_phase == Phase::Retired
}
guard "session_registered" { self.session_id != None }
update {
self.active_fence_token = None;
self.current_run_id = None;
}
to Idle
emit InitiateRecycle
}
transition RecycleFromAttached {
on input Recycle
guard { self.lifecycle_phase == Phase::Attached }
guard "session_registered" { self.session_id != None }
update {
self.active_fence_token = None;
self.current_run_id = None;
}
to Attached
emit InitiateRecycle
}
transition RecoverInputLifecycle {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input RecoverInputLifecycle {
input_id,
phase,
terminal_kind,
superseded_by,
aggregate_id,
abandon_reason,
abandon_attempt_count,
attempt_count,
run_id,
boundary_sequence,
lane
}
update {
self.input_phases.insert(input_id, phase);
if terminal_kind != None {
self.input_terminal_kind.insert(input_id, terminal_kind.get("value"));
} else {
self.input_terminal_kind.remove(input_id);
}
if superseded_by != None {
self.input_superseded_by.insert(input_id, superseded_by.get("value"));
} else {
self.input_superseded_by.remove(input_id);
}
if aggregate_id != None {
self.input_aggregate_id.insert(input_id, aggregate_id.get("value"));
} else {
self.input_aggregate_id.remove(input_id);
}
if abandon_reason != None {
self.input_abandon_reason.insert(input_id, abandon_reason.get("value"));
self.input_abandon_attempt_count.insert(input_id, abandon_attempt_count);
} else {
self.input_abandon_reason.remove(input_id);
self.input_abandon_attempt_count.remove(input_id);
}
self.input_attempt_counts.insert(input_id, attempt_count);
if run_id != None {
self.input_run_associations.insert(input_id, run_id.get("value"));
} else {
self.input_run_associations.remove(input_id);
}
if boundary_sequence != None {
self.input_boundary_sequences.insert(input_id, boundary_sequence.get("value"));
} else {
self.input_boundary_sequences.remove(input_id);
}
if !self.input_admission_seq.contains_key(input_id) {
self.input_admission_seq.insert(input_id, self.next_admission_seq);
self.next_admission_seq += 1;
}
if lane != None {
self.input_lane.insert(input_id, lane.get("value"));
} else {
self.input_lane.remove(input_id);
}
}
to Idle
emit InputLifecycleNotice
}
transition QueueAccepted {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input QueueAccepted { input_id }
guard "not_already_tracked" { !self.input_phases.contains_key(input_id) }
update {
self.input_phases.insert(input_id, InputPhase::Queued);
self.input_lane.insert(input_id, InputLane::Queue);
self.input_admission_seq.insert(input_id, self.next_admission_seq);
self.next_admission_seq += 1;
}
to Idle
emit IngressAccepted
}
transition SteerAccepted {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input SteerAccepted { input_id }
guard "not_already_tracked" { !self.input_phases.contains_key(input_id) }
update {
self.input_phases.insert(input_id, InputPhase::Queued);
self.input_lane.insert(input_id, InputLane::Steer);
self.input_admission_seq.insert(input_id, self.next_admission_seq);
self.next_admission_seq += 1;
}
to Idle
emit IngressAccepted
}
transition ChangeLane {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input ChangeLane { input_id, new_lane }
guard "input_tracked" { self.input_phases.contains_key(input_id) }
update {
self.input_lane.insert(input_id, new_lane);
}
to Idle
}
transition StageForRun {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input StageForRun { input_id, run_id }
guard "input_tracked" { self.input_phases.contains_key(input_id) }
update {
self.input_phases.insert(input_id, InputPhase::Staged);
self.input_run_associations.insert(input_id, run_id);
self.input_lane.remove(input_id);
}
to Idle
emit RecordRunAssociation
}
transition IncrementAttemptCount {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input IncrementAttemptCount { input_id }
guard "input_tracked" { self.input_phases.contains_key(input_id) }
update {
self.input_attempt_counts.increment(input_id, 1);
}
to Idle
}
transition RollbackStaged {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input RollbackStaged { input_id, lane }
guard "input_tracked" { self.input_phases.contains_key(input_id) }
update {
self.input_phases.insert(input_id, InputPhase::Queued);
self.input_run_associations.remove(input_id);
self.input_lane.insert(input_id, lane);
}
to Idle
emit InputLifecycleNotice
}
transition MarkApplied {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input MarkApplied { input_id }
guard "input_tracked" { self.input_phases.contains_key(input_id) }
update {
self.input_phases.insert(input_id, InputPhase::Applied);
}
to Idle
emit InputLifecycleNotice
}
transition MarkAppliedPendingConsumption {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input MarkAppliedPendingConsumption { input_id }
guard "input_tracked" { self.input_phases.contains_key(input_id) }
update {
self.input_phases.insert(input_id, InputPhase::AppliedPendingConsumption);
}
to Idle
emit InputLifecycleNotice
}
transition ConsumeOnAccept {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input ConsumeOnAccept { input_id }
guard "input_tracked" { self.input_phases.contains_key(input_id) }
update {
self.input_phases.insert(input_id, InputPhase::Consumed);
self.input_lane.remove(input_id);
}
to Idle
emit RecordTerminalOutcome
}
transition RecordBoundarySeq {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input RecordBoundarySeq { input_id, seq }
guard "input_tracked" { self.input_phases.contains_key(input_id) }
update {
self.input_boundary_sequences.insert(input_id, seq);
}
to Idle
emit RecordBoundarySequence
}
transition ConsumeInput {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input ConsumeInput { input_id }
guard "input_tracked" { self.input_phases.contains_key(input_id) }
update {
self.input_phases.insert(input_id, InputPhase::Consumed);
self.input_lane.remove(input_id);
self.input_terminal_kind.insert(input_id, InputTerminalKind::Consumed);
self.input_superseded_by.remove(input_id);
self.input_aggregate_id.remove(input_id);
self.input_abandon_reason.remove(input_id);
self.input_abandon_attempt_count.remove(input_id);
}
to Idle
emit RecordTerminalOutcome
}
transition SupersedeInput {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input SupersedeInput { input_id, superseded_by }
guard "input_tracked" { self.input_phases.contains_key(input_id) }
update {
self.input_phases.insert(input_id, InputPhase::Superseded);
self.input_lane.remove(input_id);
self.input_terminal_kind.insert(input_id, InputTerminalKind::Superseded);
self.input_superseded_by.insert(input_id, superseded_by);
self.input_aggregate_id.remove(input_id);
self.input_abandon_reason.remove(input_id);
self.input_abandon_attempt_count.remove(input_id);
}
to Idle
emit RecordTerminalOutcome
}
transition CoalesceInput {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input CoalesceInput { input_id, aggregate_id }
guard "input_tracked" { self.input_phases.contains_key(input_id) }
update {
self.input_phases.insert(input_id, InputPhase::Coalesced);
self.input_lane.remove(input_id);
self.input_terminal_kind.insert(input_id, InputTerminalKind::Coalesced);
self.input_aggregate_id.insert(input_id, aggregate_id);
self.input_superseded_by.remove(input_id);
self.input_abandon_reason.remove(input_id);
self.input_abandon_attempt_count.remove(input_id);
}
to Idle
emit RecordTerminalOutcome
}
transition AbandonInput {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input AbandonInput { input_id, reason, attempt_count }
guard "input_tracked" { self.input_phases.contains_key(input_id) }
update {
self.input_phases.insert(input_id, InputPhase::Abandoned);
self.input_lane.remove(input_id);
self.input_terminal_kind.insert(input_id, InputTerminalKind::Abandoned);
self.input_abandon_reason.insert(input_id, reason);
self.input_abandon_attempt_count.insert(input_id, attempt_count);
self.input_superseded_by.remove(input_id);
self.input_aggregate_id.remove(input_id);
}
to Idle
emit RecordTerminalOutcome
}
transition RegisterOp {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input RegisterOp { operation_id, kind }
guard "not_already_registered" { !self.op_statuses.contains_key(operation_id) }
update {
self.op_statuses.insert(operation_id, OperationStatus::Provisioning);
self.op_kinds.insert(operation_id, kind);
self.op_peer_ready.insert(operation_id, false);
self.op_progress_counts.insert(operation_id, 0);
self.active_op_count += 1;
}
to Idle
emit SubmitOpEvent { operation_id: operation_id }
}
transition StartOp {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input StartOp { operation_id }
guard "op_registered" { self.op_statuses.contains_key(operation_id) }
guard "from_status_valid" {
self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Provisioning)
}
update {
self.op_statuses.insert(operation_id, OperationStatus::Running);
}
to Idle
emit SubmitOpEvent { operation_id: operation_id }
}
transition CompleteOp {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input CompleteOp { operation_id, outcome, payload }
guard "op_registered" { self.op_statuses.contains_key(operation_id) }
guard "from_status_valid" {
self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Running)
|| self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Retiring)
}
update {
self.op_statuses.insert(operation_id, OperationStatus::Completed);
self.op_terminal_outcomes.insert(operation_id, outcome);
self.op_terminal_payload.insert(operation_id, payload);
self.active_op_count -= 1;
self.op_completion_seq.insert(operation_id, self.next_completion_seq);
self.next_completion_seq += 1;
}
to Idle
emit SubmitOpEvent { operation_id: operation_id }
emit NotifyOpWatcher { operation_id: operation_id }
}
transition FailOp {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input FailOp { operation_id, outcome, payload }
guard "op_registered" { self.op_statuses.contains_key(operation_id) }
guard "from_status_valid" {
self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Provisioning)
|| self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Running)
|| self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Retiring)
}
update {
self.op_statuses.insert(operation_id, OperationStatus::Failed);
self.op_terminal_outcomes.insert(operation_id, outcome);
self.op_terminal_payload.insert(operation_id, payload);
self.active_op_count -= 1;
}
to Idle
emit SubmitOpEvent { operation_id: operation_id }
emit NotifyOpWatcher { operation_id: operation_id }
}
transition CancelOp {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input CancelOp { operation_id, outcome, payload }
guard "op_registered" { self.op_statuses.contains_key(operation_id) }
guard "from_status_valid" {
self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Provisioning)
|| self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Running)
|| self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Retiring)
}
update {
self.op_statuses.insert(operation_id, OperationStatus::Cancelled);
self.op_terminal_outcomes.insert(operation_id, outcome);
self.op_terminal_payload.insert(operation_id, payload);
self.active_op_count -= 1;
}
to Idle
emit SubmitOpEvent { operation_id: operation_id }
emit NotifyOpWatcher { operation_id: operation_id }
}
transition AbortOp {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input AbortOp { operation_id, outcome, payload }
guard "op_registered" { self.op_statuses.contains_key(operation_id) }
guard "from_status_valid" {
self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Provisioning)
}
update {
self.op_statuses.insert(operation_id, OperationStatus::Aborted);
self.op_terminal_outcomes.insert(operation_id, outcome);
self.op_terminal_payload.insert(operation_id, payload);
self.active_op_count -= 1;
}
to Idle
emit SubmitOpEvent { operation_id: operation_id }
emit NotifyOpWatcher { operation_id: operation_id }
}
transition PeerReadyOp {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input PeerReadyOp { operation_id }
guard "op_registered" { self.op_statuses.contains_key(operation_id) }
guard "kind_is_mob_member_child" {
self.op_kinds.get_copied(operation_id) == Some(OperationKind::MobMemberChild)
}
guard "not_already_peer_ready" {
self.op_peer_ready.get_copied(operation_id) != Some(true)
}
guard "from_status_valid" {
self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Running)
|| self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Retiring)
}
update {
self.op_peer_ready.insert(operation_id, true);
}
to Idle
emit SubmitOpEvent { operation_id: operation_id }
}
transition ProgressReportedOp {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input ProgressReportedOp { operation_id }
guard "op_registered" { self.op_statuses.contains_key(operation_id) }
guard "from_status_valid" {
self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Running)
|| self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Retiring)
}
update {
self.op_progress_counts.increment(operation_id, 1);
}
to Idle
emit SubmitOpEvent { operation_id: operation_id }
}
transition RetireRequestedOp {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input RetireRequestedOp { operation_id }
guard "op_registered" { self.op_statuses.contains_key(operation_id) }
guard "from_status_valid" {
self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Running)
}
update {
self.op_statuses.insert(operation_id, OperationStatus::Retiring);
}
to Idle
emit SubmitOpEvent { operation_id: operation_id }
}
transition RetireCompletedOp {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input RetireCompletedOp { operation_id, outcome, payload }
guard "op_registered" { self.op_statuses.contains_key(operation_id) }
guard "from_status_valid" {
self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Running)
|| self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Retiring)
}
update {
self.op_statuses.insert(operation_id, OperationStatus::Retired);
self.op_terminal_outcomes.insert(operation_id, outcome);
self.op_terminal_payload.insert(operation_id, payload);
self.active_op_count -= 1;
}
to Idle
emit SubmitOpEvent { operation_id: operation_id }
emit NotifyOpWatcher { operation_id: operation_id }
}
transition TerminateOp {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input TerminateOp { operation_id, outcome, payload }
guard "op_registered" { self.op_statuses.contains_key(operation_id) }
guard "from_status_valid" {
self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Provisioning)
|| self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Running)
|| self.op_statuses.get_copied(operation_id) == Some(OperationStatus::Retiring)
}
update {
self.op_statuses.insert(operation_id, OperationStatus::Terminated);
self.op_terminal_outcomes.insert(operation_id, outcome);
self.op_terminal_payload.insert(operation_id, payload);
self.active_op_count -= 1;
}
to Idle
emit SubmitOpEvent { operation_id: operation_id }
emit NotifyOpWatcher { operation_id: operation_id }
}
transition RequestWaitAll {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input RequestWaitAll { wait_request_id, operation_ids, operation_id_tokens }
update {
self.wait_active = true;
self.wait_request_id = Some(wait_request_id);
self.wait_operation_ids = operation_ids;
self.wait_operation_id_tokens = operation_id_tokens;
}
to Idle
}
transition SatisfyWaitAll {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input SatisfyWaitAll { wait_request_id, operation_id_tokens }
guard "wait_is_active" { self.wait_active == true }
guard "wait_request_matches" { self.wait_request_id == Some(wait_request_id) }
guard "operation_tokens_match" { self.wait_operation_id_tokens == operation_id_tokens }
guard "all_members_terminal" {
for_all(member_id in self.wait_operation_ids,
self.op_statuses.get_copied(member_id) == Some(OperationStatus::Completed)
|| self.op_statuses.get_copied(member_id) == Some(OperationStatus::Failed)
|| self.op_statuses.get_copied(member_id) == Some(OperationStatus::Aborted)
|| self.op_statuses.get_copied(member_id) == Some(OperationStatus::Cancelled)
|| self.op_statuses.get_copied(member_id) == Some(OperationStatus::Retired)
|| self.op_statuses.get_copied(member_id) == Some(OperationStatus::Terminated))
}
update {
self.wait_active = false;
self.wait_request_id = None;
self.wait_operation_ids = EmptySet;
self.wait_operation_id_tokens = EmptySet;
}
to Idle
emit WaitAllSatisfied {
wait_request_id: wait_request_id,
operation_ids: operation_id_tokens
}
}
transition CancelWaitAll {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input CancelWaitAll
guard "wait_is_active" { self.wait_active == true }
update {
self.wait_active = false;
self.wait_request_id = None;
self.wait_operation_ids = EmptySet;
self.wait_operation_id_tokens = EmptySet;
}
to Idle
}
transition SpawnDrain {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input SpawnDrain { mode }
guard "drain_can_spawn" { self.drain_phase == DrainPhase::Inactive || self.drain_phase == DrainPhase::Stopped || self.drain_phase == DrainPhase::ExitedRespawnable }
update {
self.drain_phase = DrainPhase::Running;
self.drain_mode = Some(mode);
}
to Idle
emit SpawnDrainTask
}
transition StopDrain {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input StopDrain
guard "drain_is_running" { self.drain_phase == DrainPhase::Running }
update {
self.drain_phase = DrainPhase::Stopped;
}
to Idle
}
transition DrainExitedClean {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input DrainExitedClean
update {
self.drain_phase = DrainPhase::Inactive;
self.drain_mode = None;
}
to Idle
}
transition DrainExitedRespawnable {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input DrainExitedRespawnable
update {
self.drain_phase = DrainPhase::ExitedRespawnable;
}
to Idle
}
transition StageVisibilityFilter {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input StageVisibilityFilter { filter }
update {
self.next_staged_visibility_revision = self.next_staged_visibility_revision + 1;
self.staged_filter = filter;
self.staged_visibility_revision = self.next_staged_visibility_revision;
}
to Idle
emit RefreshVisibleSurfaceSet { snapshot_epoch: self.snapshot_epoch }
}
transition CommitVisibilityFilter {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input CommitVisibilityFilter { filter, revision }
update {
self.active_filter = filter;
self.active_visibility_revision = revision;
}
to Idle
emit RefreshVisibleSurfaceSet { snapshot_epoch: self.snapshot_epoch }
}
transition StageDeferredNames {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input StageDeferredNames { names }
guard "deferred_names_empty" { names == EmptySet }
update {
self.next_staged_visibility_revision = self.next_staged_visibility_revision + 1;
self.staged_deferred_names = names;
self.staged_deferred_authorities = EmptyMap;
self.staged_visibility_revision = self.next_staged_visibility_revision;
}
to Idle
emit RefreshVisibleSurfaceSet { snapshot_epoch: self.snapshot_epoch }
}
transition CommitDeferredNames {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input CommitDeferredNames { authorities }
guard "deferred_authorities_have_identity" {
deferred_authorities_have_identity(authorities.keys(), authorities)
}
update {
self.active_deferred_names = authorities.keys();
self.active_deferred_authorities = authorities;
}
to Idle
emit RefreshVisibleSurfaceSet { snapshot_epoch: self.snapshot_epoch }
}
transition SyncVisibilityRevisions {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input SyncVisibilityRevisions {
active_revision, staged_revision,
active_deferred_names, staged_deferred_names,
active_deferred_authorities, staged_deferred_authorities
}
guard "counter_advances" {
active_revision > self.next_staged_visibility_revision
|| staged_revision > self.next_staged_visibility_revision
}
guard "active_deferred_authorities_cover_names" {
for_all(requested_name in active_deferred_names, active_deferred_authorities.contains_key(requested_name))
}
guard "staged_deferred_authorities_cover_names" {
for_all(requested_name in staged_deferred_names, staged_deferred_authorities.contains_key(requested_name))
}
guard "active_deferred_authorities_are_name_scoped" {
for_all(witnessed_name in active_deferred_authorities.keys(), active_deferred_names.contains(witnessed_name))
}
guard "staged_deferred_authorities_are_name_scoped" {
for_all(witnessed_name in staged_deferred_authorities.keys(), staged_deferred_names.contains(witnessed_name))
}
guard "active_deferred_authorities_have_identity" {
deferred_authorities_have_identity(active_deferred_names, active_deferred_authorities)
}
guard "staged_deferred_authorities_have_identity" {
deferred_authorities_have_identity(staged_deferred_names, staged_deferred_authorities)
}
update {
self.active_deferred_names = active_deferred_names;
self.staged_deferred_names = staged_deferred_names;
self.active_deferred_authorities = active_deferred_authorities;
self.staged_deferred_authorities = staged_deferred_authorities;
if active_revision > self.next_staged_visibility_revision {
self.next_staged_visibility_revision = active_revision;
}
if staged_revision > self.next_staged_visibility_revision {
self.next_staged_visibility_revision = staged_revision;
}
}
to Idle
}
transition McpServerConnectPending {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input McpServerConnectPending { server_id }
guard "session_registered" { self.session_id != None }
update {
self.mcp_server_states.insert(server_id, McpServerState::PendingConnect);
}
to Idle
emit McpServerStateChanged { server_id: server_id, new_state: McpServerState::PendingConnect }
}
transition McpServerConnected {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input McpServerConnected { server_id }
guard "session_registered" { self.session_id != None }
update {
self.mcp_server_states.insert(server_id, McpServerState::Connected);
}
to Idle
emit McpServerStateChanged { server_id: server_id, new_state: McpServerState::Connected }
}
transition McpServerFailed {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input McpServerFailed { server_id, error }
guard "session_registered" { self.session_id != None }
update {
self.mcp_server_states.insert(server_id, McpServerState::Failed);
}
to Idle
emit McpServerStateChanged { server_id: server_id, new_state: McpServerState::Failed }
}
transition McpServerDisconnected {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input McpServerDisconnected { server_id }
guard "session_registered" { self.session_id != None }
update {
self.mcp_server_states.insert(server_id, McpServerState::Disconnected);
}
to Idle
emit McpServerStateChanged { server_id: server_id, new_state: McpServerState::Disconnected }
}
transition McpServerReload {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input McpServerReload { server_id }
guard "session_registered" { self.session_id != None }
update {
self.mcp_server_states.insert(server_id, McpServerState::PendingConnect);
}
to Idle
emit McpServerReloadRequested { server_id: server_id }
emit McpServerStateChanged { server_id: server_id, new_state: McpServerState::PendingConnect }
}
transition PeerRequestSent {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input PeerRequestSent { corr_id, to }
guard "not_already_pending" { !self.pending_peer_requests.contains_key(corr_id) }
update {
self.pending_peer_requests.insert(corr_id, OutboundPeerRequestState::Sent);
}
to Idle
emit PeerInteractionStateChanged { corr_id: corr_id, new_state: OutboundPeerRequestState::Sent }
}
transition PeerResponseProgressArrived {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input PeerResponseProgressArrived { corr_id }
guard "pending_exists" { self.pending_peer_requests.contains_key(corr_id) }
update {
self.pending_peer_requests.insert(corr_id, OutboundPeerRequestState::AcceptedProgress);
}
to Idle
emit PeerInteractionStateChanged { corr_id: corr_id, new_state: OutboundPeerRequestState::AcceptedProgress }
}
transition PeerResponseTerminalArrivedCompleted {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input PeerResponseTerminalArrived { corr_id, disposition }
guard "pending_exists" { self.pending_peer_requests.contains_key(corr_id) }
guard "completed" { disposition == PeerTerminalDisposition::Completed }
update {
self.pending_peer_requests.remove(corr_id);
}
to Idle
emit PeerInteractionStateChanged { corr_id: corr_id, new_state: OutboundPeerRequestState::Completed }
emit PeerInteractionCleanup { corr_id: corr_id }
}
transition PeerResponseTerminalArrivedFailed {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input PeerResponseTerminalArrived { corr_id, disposition }
guard "pending_exists" { self.pending_peer_requests.contains_key(corr_id) }
guard "failed" { disposition == PeerTerminalDisposition::Failed }
update {
self.pending_peer_requests.remove(corr_id);
}
to Idle
emit PeerInteractionStateChanged { corr_id: corr_id, new_state: OutboundPeerRequestState::Failed }
emit PeerInteractionCleanup { corr_id: corr_id }
}
transition PeerRequestTimedOut {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input PeerRequestTimedOut { corr_id }
guard "pending_exists" { self.pending_peer_requests.contains_key(corr_id) }
update {
self.pending_peer_requests.remove(corr_id);
}
to Idle
emit PeerInteractionStateChanged { corr_id: corr_id, new_state: OutboundPeerRequestState::TimedOut }
emit PeerInteractionCleanup { corr_id: corr_id }
}
transition PeerRequestReceived {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input PeerRequestReceived { corr_id }
guard "not_already_inbound" { !self.inbound_peer_requests.contains_key(corr_id) }
update {
self.inbound_peer_requests.insert(corr_id, InboundPeerRequestState::Received);
}
to Idle
emit InboundPeerInteractionStateChanged { corr_id: corr_id, new_state: InboundPeerRequestState::Received }
}
transition PeerResponseReplied {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input PeerResponseReplied { corr_id }
guard "inbound_exists" { self.inbound_peer_requests.contains_key(corr_id) }
update {
self.inbound_peer_requests.remove(corr_id);
}
to Idle
emit InboundPeerInteractionStateChanged { corr_id: corr_id, new_state: InboundPeerRequestState::Replied }
}
transition AdvanceSessionContext {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input AdvanceSessionContext { updated_at_ms }
guard "monotonic" { updated_at_ms > self.last_session_context_updated_at_ms }
update {
self.last_session_context_updated_at_ms = updated_at_ms;
}
to Idle
emit SessionContextAdvanced { updated_at_ms: updated_at_ms }
}
transition InteractionStreamReserved {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input InteractionStreamReserved { corr_id }
guard "not_reserved" { !self.reserved_interaction_streams.contains(corr_id) }
guard "not_attached" { !self.attached_interaction_streams.contains(corr_id) }
update {
self.reserved_interaction_streams.insert(corr_id);
}
to Idle
emit InteractionStreamStateChanged { corr_id: corr_id, new_state: InteractionStreamState::Reserved }
}
transition InteractionStreamAttached {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input InteractionStreamAttached { corr_id }
guard "is_reserved" { self.reserved_interaction_streams.contains(corr_id) }
update {
self.reserved_interaction_streams.remove(corr_id);
self.attached_interaction_streams.insert(corr_id);
}
to Idle
emit InteractionStreamStateChanged { corr_id: corr_id, new_state: InteractionStreamState::Attached }
}
transition InteractionStreamCompleted {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input InteractionStreamCompleted { corr_id }
guard "is_attached" { self.attached_interaction_streams.contains(corr_id) }
update {
self.attached_interaction_streams.remove(corr_id);
}
to Idle
emit InteractionStreamStateChanged { corr_id: corr_id, new_state: InteractionStreamState::Completed }
emit InteractionStreamCleanup { corr_id: corr_id }
}
transition InteractionStreamExpired {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input InteractionStreamExpired { corr_id }
guard "is_reserved" { self.reserved_interaction_streams.contains(corr_id) }
update {
self.reserved_interaction_streams.remove(corr_id);
}
to Idle
emit InteractionStreamStateChanged { corr_id: corr_id, new_state: InteractionStreamState::Expired }
emit InteractionStreamCleanup { corr_id: corr_id }
}
transition InteractionStreamClosedEarly {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input InteractionStreamClosedEarly { corr_id }
guard "is_attached" { self.attached_interaction_streams.contains(corr_id) }
update {
self.attached_interaction_streams.remove(corr_id);
}
to Idle
emit InteractionStreamStateChanged { corr_id: corr_id, new_state: InteractionStreamState::ClosedEarly }
emit InteractionStreamCleanup { corr_id: corr_id }
}
transition AttachSessionIngress {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input AttachSessionIngress { comms_runtime_id }
guard "session_registered" { self.session_id != None }
guard "owner_allows_session_attach" {
self.peer_ingress_owner_kind == PeerIngressOwnerKind::Unattached
|| (
self.peer_ingress_owner_kind == PeerIngressOwnerKind::SessionOwned
&& self.peer_ingress_comms_runtime_id == Some(comms_runtime_id)
&& self.peer_ingress_mob_id == None
)
}
update {
self.peer_ingress_owner_kind = PeerIngressOwnerKind::SessionOwned;
self.peer_ingress_comms_runtime_id = Some(comms_runtime_id);
self.peer_ingress_mob_id = None;
}
to Idle
}
transition AttachMobIngress {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input AttachMobIngress { comms_runtime_id, mob_id }
guard "session_registered" { self.session_id != None }
guard "owner_allows_mob_attach" {
self.peer_ingress_owner_kind == PeerIngressOwnerKind::Unattached
|| self.peer_ingress_owner_kind == PeerIngressOwnerKind::SessionOwned
|| (
self.peer_ingress_owner_kind == PeerIngressOwnerKind::MobOwned
&& self.peer_ingress_comms_runtime_id == Some(comms_runtime_id)
&& self.peer_ingress_mob_id == Some(mob_id)
)
}
update {
self.peer_ingress_owner_kind = PeerIngressOwnerKind::MobOwned;
self.peer_ingress_comms_runtime_id = Some(comms_runtime_id);
self.peer_ingress_mob_id = Some(mob_id);
}
to Idle
}
transition DetachIngress {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input DetachIngress
guard "session_registered" { self.session_id != None }
update {
self.peer_ingress_owner_kind = PeerIngressOwnerKind::Unattached;
self.peer_ingress_comms_runtime_id = None;
self.peer_ingress_mob_id = None;
}
to Idle
}
transition BindSupervisor {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input BindSupervisor { name, peer_id, address, epoch }
guard "supervisor_unbound" {
self.supervisor_binding_kind == SupervisorBindingKind::Unbound
}
update {
self.supervisor_binding_kind = SupervisorBindingKind::Bound;
self.supervisor_bound_name = Some(name);
self.supervisor_bound_peer_id = Some(peer_id);
self.supervisor_bound_address = Some(address);
self.supervisor_bound_epoch = Some(epoch);
}
to Idle
emit PublishSupervisorTrustEdge {
peer_id: self.supervisor_bound_peer_id.get("value"),
name: self.supervisor_bound_name.get("value"),
address: self.supervisor_bound_address.get("value"),
signing_public_key: None,
epoch: self.supervisor_bound_epoch.get("value")
}
}
transition AuthorizeSupervisor {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input AuthorizeSupervisor { name, peer_id, address, epoch }
guard "supervisor_bound" {
self.supervisor_binding_kind == SupervisorBindingKind::Bound
}
update {
self.supervisor_bound_name = Some(name);
self.supervisor_bound_peer_id = Some(peer_id);
self.supervisor_bound_address = Some(address);
self.supervisor_bound_epoch = Some(epoch);
}
to Idle
emit PublishSupervisorTrustEdge {
peer_id: self.supervisor_bound_peer_id.get("value"),
name: self.supervisor_bound_name.get("value"),
address: self.supervisor_bound_address.get("value"),
signing_public_key: None,
epoch: self.supervisor_bound_epoch.get("value")
}
}
transition RevokeSupervisor {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input RevokeSupervisor { peer_id, epoch }
guard "supervisor_bound" {
self.supervisor_binding_kind == SupervisorBindingKind::Bound
}
guard "peer_id_matches_current" {
self.supervisor_bound_peer_id == Some(peer_id)
}
guard "epoch_matches_current" {
self.supervisor_bound_epoch == Some(epoch)
}
update {
self.supervisor_binding_kind = SupervisorBindingKind::Unbound;
self.supervisor_bound_name = None;
self.supervisor_bound_peer_id = None;
self.supervisor_bound_address = None;
self.supervisor_bound_epoch = None;
}
to Idle
emit RevokeSupervisorTrustEdge { peer_id: peer_id, epoch: epoch }
}
transition SupervisorTrustEdgePublished {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input SupervisorTrustEdgePublished { peer_id, epoch }
guard "supervisor_bound" {
self.supervisor_binding_kind == SupervisorBindingKind::Bound
}
guard "peer_id_matches_current" {
self.supervisor_bound_peer_id == Some(peer_id)
}
guard "epoch_matches_current" {
self.supervisor_bound_epoch == Some(epoch)
}
update {}
to Idle
}
transition SupervisorTrustEdgePublishFailed {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input SupervisorTrustEdgePublishFailed { peer_id, epoch, reason }
guard "supervisor_bound" {
self.supervisor_binding_kind == SupervisorBindingKind::Bound
}
guard "peer_id_matches_current" {
self.supervisor_bound_peer_id == Some(peer_id)
}
guard "epoch_matches_current" {
self.supervisor_bound_epoch == Some(epoch)
}
update {}
to Idle
}
transition SupervisorTrustEdgeRevoked {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input SupervisorTrustEdgeRevoked { peer_id, epoch }
guard "supervisor_bound" {
self.supervisor_binding_kind == SupervisorBindingKind::Bound
}
guard "peer_id_matches_current" {
self.supervisor_bound_peer_id == Some(peer_id)
}
guard "epoch_matches_current" {
self.supervisor_bound_epoch == Some(epoch)
}
update {}
to Idle
}
transition SupervisorTrustEdgeRevokeFailed {
per_phase [Idle, Attached, Running, Retired, Stopped]
on input SupervisorTrustEdgeRevokeFailed { peer_id, epoch, reason }
guard "supervisor_bound" {
self.supervisor_binding_kind == SupervisorBindingKind::Bound
}
guard "peer_id_matches_current" {
self.supervisor_bound_peer_id == Some(peer_id)
}
guard "epoch_matches_current" {
self.supervisor_bound_epoch == Some(epoch)
}
update {}
to Idle
}
transition PublishLocalEndpoint {
per_phase [Idle, Attached, Running]
on input PublishLocalEndpoint { endpoint }
update {
self.local_endpoint = Some(endpoint);
}
to Idle
emit LocalEndpointChanged { endpoint: Some(endpoint) }
}
transition ClearLocalEndpoint {
per_phase [Idle, Attached, Running]
on input ClearLocalEndpoint
guard "local_endpoint_present" { self.local_endpoint != None }
update {
self.local_endpoint = None;
}
to Idle
emit LocalEndpointChanged { endpoint: None }
}
transition AddDirectPeerEndpoint {
per_phase [Idle, Attached, Running]
on input AddDirectPeerEndpoint { endpoint }
guard "endpoint_not_already_direct" { self.direct_peer_endpoints.contains(endpoint) == false }
update {
self.direct_peer_endpoints.insert(endpoint);
self.peer_projection_epoch += 1;
}
to Idle
emit PeerProjectionChanged { peer_projection_epoch: self.peer_projection_epoch }
emit CommsTrustReconcileRequested { peer_projection_epoch: self.peer_projection_epoch }
}
transition RemoveDirectPeerEndpoint {
per_phase [Idle, Attached, Running]
on input RemoveDirectPeerEndpoint { endpoint }
guard "endpoint_present_in_direct" { self.direct_peer_endpoints.contains(endpoint) == true }
update {
self.direct_peer_endpoints.remove(endpoint);
self.peer_projection_epoch += 1;
}
to Idle
emit PeerProjectionChanged { peer_projection_epoch: self.peer_projection_epoch }
emit CommsTrustReconcileRequested { peer_projection_epoch: self.peer_projection_epoch }
}
transition ApplyMobPeerOverlay {
per_phase [Idle, Attached, Running]
on input ApplyMobPeerOverlay { epoch, endpoints }
guard "stale_overlay_epoch" { epoch > self.mob_overlay_epoch }
update {
self.mob_overlay_peer_endpoints = endpoints;
self.mob_overlay_epoch = epoch;
self.peer_projection_epoch += 1;
}
to Idle
emit PeerProjectionChanged { peer_projection_epoch: self.peer_projection_epoch }
emit CommsTrustReconcileRequested { peer_projection_epoch: self.peer_projection_epoch }
}
}
}
};
}
crate::meerkat_catalog_machine_dsl!("self", "catalog::dsl::meerkat_machine");