Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,518 changes: 1,518 additions & 0 deletions apps/decodex/src/execution_program.rs

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions apps/decodex/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ mod cli;
mod codex_config;
mod commit_message;
mod default_branch_sync;
mod execution_program;
mod git_credentials;
mod github;
mod loop_contract;
Expand Down
2 changes: 1 addition & 1 deletion apps/decodex/src/orchestrator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ use time::{OffsetDateTime, format_description::well_known::Rfc3339};

use crate::{agent, default_branch_sync, git_credentials, maintenance, state};
#[rustfmt::skip]
use crate::{agent::{ACTIVE_RUN_IDLE_TIMEOUT, AppServerCapabilityPreflightFailure, AppServerDynamicToolFailure, AppServerHomePreflightFailure, AppServerPhaseGoalFailure, AppServerProcessEnv, AppServerRunRequest, AppServerRunResult, AppServerTransportFailure, AppServerTurnFailure, ISSUE_DELIVERY_CLOSEOUT_COMPLETE_TOOL_NAME, ISSUE_LABEL_ADD_TOOL_NAME, ISSUE_PROGRESS_CHECKPOINT_TOOL_NAME, ISSUE_REVIEW_CHECKPOINT_TOOL_NAME, ISSUE_REVIEW_HANDOFF_TOOL_NAME, ISSUE_REVIEW_REPAIR_COMPLETE_TOOL_NAME, ISSUE_TERMINAL_FINALIZE_TOOL_NAME, ISSUE_TRANSITION_TOOL_NAME, DecodexRunContext, DecodexToolBridge, PhaseGoalController, PhaseGoalKind, PhaseGoalSpec, PhaseGoalTransition, ReviewExecutionMode, ReviewHandoffContext, ReviewHandoffWritebackFailed, ReviewPolicyStopReason, ReviewPolicyStopRequested, RunCompletionDisposition, TrackerToolBridge, TurnContinuationGuard}, config::{InternalReviewMode, ServiceConfig}, git_credentials::GitCredentialSource, github, prelude::{Result, eyre}, state::{ChildAgentActivityBucket, ChildAgentActivitySummary, CodexAccountActivitySummary, ProjectRegistration, ProjectRunStatus, ProtocolActivitySummary, RUN_OPERATION_AGENT_RUN, RUN_OPERATION_APP_SERVER_PREFLIGHT, RUN_OPERATION_GIT_CREDENTIALS, RUN_OPERATION_IDLE, RUN_OPERATION_RECONCILIATION, RUN_OPERATION_REPO_GATE, RUN_OPERATION_REVIEW_WRITEBACK, RUN_OPERATION_WAITING_EXTERNAL, ReviewHandoffMarker, ReviewOrchestrationMarker, RunActivityMarker, RunAttempt, StateStore, WorktreeMapping}, tracker::{IssueTracker, TrackerComment, TrackerIssue, linear::LinearClient, records}, workflow::{WorkflowDocument, WorkflowExecution}, worktree::{WorktreeManager, WorktreeSpec}};
use crate::{agent::{ACTIVE_RUN_IDLE_TIMEOUT, AppServerCapabilityPreflightFailure, AppServerDynamicToolFailure, AppServerHomePreflightFailure, AppServerPhaseGoalFailure, AppServerProcessEnv, AppServerRunRequest, AppServerRunResult, AppServerTransportFailure, AppServerTurnFailure, ISSUE_DELIVERY_CLOSEOUT_COMPLETE_TOOL_NAME, ISSUE_LABEL_ADD_TOOL_NAME, ISSUE_PROGRESS_CHECKPOINT_TOOL_NAME, ISSUE_REVIEW_CHECKPOINT_TOOL_NAME, ISSUE_REVIEW_HANDOFF_TOOL_NAME, ISSUE_REVIEW_REPAIR_COMPLETE_TOOL_NAME, ISSUE_TERMINAL_FINALIZE_TOOL_NAME, ISSUE_TRANSITION_TOOL_NAME, DecodexRunContext, DecodexToolBridge, PhaseGoalController, PhaseGoalKind, PhaseGoalSpec, PhaseGoalTransition, ReviewExecutionMode, ReviewHandoffContext, ReviewHandoffWritebackFailed, ReviewPolicyStopReason, ReviewPolicyStopRequested, RunCompletionDisposition, TrackerToolBridge, TurnContinuationGuard}, config::{InternalReviewMode, ServiceConfig}, execution_program::{ExecutionProgramOperatorSummary, ExecutionProgramReadinessContext, ExecutionWorkflowPolicy}, git_credentials::GitCredentialSource, github, prelude::{Result, eyre}, state::{ChildAgentActivityBucket, ChildAgentActivitySummary, CodexAccountActivitySummary, ExecutionProgramRecord, ProjectRegistration, ProjectRunStatus, ProtocolActivitySummary, RUN_OPERATION_AGENT_RUN, RUN_OPERATION_APP_SERVER_PREFLIGHT, RUN_OPERATION_GIT_CREDENTIALS, RUN_OPERATION_IDLE, RUN_OPERATION_RECONCILIATION, RUN_OPERATION_REPO_GATE, RUN_OPERATION_REVIEW_WRITEBACK, RUN_OPERATION_WAITING_EXTERNAL, ReviewHandoffMarker, ReviewOrchestrationMarker, RunActivityMarker, RunAttempt, StateStore, WorktreeMapping}, tracker::{IssueTracker, TrackerComment, TrackerIssue, linear::LinearClient, records}, workflow::{WorkflowDocument, WorkflowExecution}, worktree::{WorktreeManager, WorktreeSpec}};

include!("orchestrator/types.rs");

Expand Down
2 changes: 2 additions & 0 deletions apps/decodex/src/orchestrator/entrypoints.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1086,6 +1086,7 @@ fn append_control_plane_project_snapshot(
snapshot.active_runs.extend(project_snapshot.active_runs);
snapshot.recent_runs.extend(project_snapshot.recent_runs);
snapshot.history_lanes.extend(project_snapshot.history_lanes);
snapshot.execution_programs.extend(project_snapshot.execution_programs);
snapshot.queued_candidates.extend(project_snapshot.queued_candidates);
snapshot.worktrees.extend(project_snapshot.worktrees);
snapshot.post_review_lanes.extend(project_snapshot.post_review_lanes);
Expand Down Expand Up @@ -1616,6 +1617,7 @@ fn empty_control_plane_snapshot(limit: usize) -> OperatorStatusSnapshot {
active_runs: Vec::new(),
recent_runs: Vec::new(),
history_lanes: Vec::new(),
execution_programs: Vec::new(),
queued_candidates: Vec::new(),
worktrees: Vec::new(),
post_review_lanes: Vec::new(),
Expand Down
79 changes: 79 additions & 0 deletions apps/decodex/src/orchestrator/status.rs
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,7 @@ fn build_operator_status_snapshot_with_account_mode(
active_runs,
recent_runs,
history_lanes,
execution_programs: Vec::new(),
queued_candidates: Vec::new(),
worktrees,
post_review_lanes: Vec::new(),
Expand Down Expand Up @@ -534,6 +535,9 @@ where
options.account_activity_mode,
)?;

snapshot.execution_programs =
operator_execution_program_statuses(project, workflow, state_store)?;

hydrate_history_lanes_from_local_ledger(project, state_store, &mut snapshot)?;
hydrate_live_operator_external_observers(
LiveOperatorStatusObserverContext {
Expand All @@ -557,6 +561,36 @@ where
Ok(snapshot)
}

fn operator_execution_program_statuses(
project: &ServiceConfig,
workflow: &WorkflowDocument,
state_store: &StateStore,
) -> crate::prelude::Result<Vec<OperatorExecutionProgramStatus>> {
let policy = ExecutionWorkflowPolicy::from_workflow(project.service_id(), workflow)?;
let context = ExecutionProgramReadinessContext::new();
let mut statuses = Vec::new();

for record in state_store.list_execution_programs(project.service_id())? {
let Some(contract) =
state_store.decision_contract(project.service_id(), record.source_contract_id())?
else {
statuses.push(OperatorExecutionProgramStatus::missing_contract(&record));

continue;
};
let evaluation = record.program().evaluate(contract.contract(), &policy, &context)?;

statuses.push(OperatorExecutionProgramStatus::from_summary(
&record,
evaluation.operator_summary(),
));
}

statuses.sort_by(|left, right| left.program_id.cmp(&right.program_id));

Ok(statuses)
}

fn hydrate_live_operator_external_observers<T>(
context: LiveOperatorStatusObserverContext<'_, T>,
snapshot: &mut OperatorStatusSnapshot,
Expand Down Expand Up @@ -5164,8 +5198,15 @@ fn render_operator_status(snapshot: &OperatorStatusSnapshot) -> String {
"Stale closed queue labels: {}\n",
stale_closed_queue_labels.len()
));
output.push_str(&format!(
"Execution programs: {}\n",
snapshot.execution_programs.len()
));
output.push_str(&format!("Recovery worktrees: {}\n", recovery_worktrees.len()));
output.push_str(&format!("Post-review lanes: {}\n", snapshot.post_review_lanes.len()));

append_rendered_execution_programs(&mut output, snapshot);

output.push_str("\nRunning Lanes\n");

if snapshot.active_runs.is_empty() {
Expand Down Expand Up @@ -5217,6 +5258,44 @@ fn render_operator_status(snapshot: &OperatorStatusSnapshot) -> String {
output
}

fn append_rendered_execution_programs(output: &mut String, snapshot: &OperatorStatusSnapshot) {
output.push_str("\nExecution Programs\n");

if snapshot.execution_programs.is_empty() {
output.push_str("- none\n");

return;
}

for program in &snapshot.execution_programs {
let mapped_issues = if program.mapped_issue_identifiers.is_empty() {
String::from("none")
} else {
program.mapped_issue_identifiers.join(", ")
};
let readback_warning = program
.readback_warning
.as_ref()
.map_or_else(String::new, |warning| format!(" readback_warning={warning}"));

output.push_str(&format!(
"- program_id: {} source_contract_id: {} nodes={} ready={} blocked={} paused={} active={} completed={} stale={} queue_label_eligible={} mapped_issues={}{}\n",
program.program_id,
program.source_contract_id,
program.node_count,
program.ready_count,
program.blocked_count,
program.paused_count,
program.active_count,
program.completed_count,
program.stale_count,
program.queue_label_eligible_count,
mapped_issues,
readback_warning,
));
}
}

fn append_rendered_github_cli_authority(output: &mut String, snapshot: &OperatorStatusSnapshot) {
if let Some(authority) = rendered_project_github_cli_authority(snapshot) {
output.push_str(&format!(
Expand Down
2 changes: 1 addition & 1 deletion apps/decodex/src/orchestrator/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ use crate::config::{InternalReviewMode, ServiceConfig};
#[rustfmt::skip]
use crate::github;
#[rustfmt::skip]
use crate::orchestrator::{self, ActiveChildRunContext, ActiveRunDisposition, ActiveRunReconciliation, ActiveWorkflowOverride, AgentEvidenceSource, ChildExitRetryContext, ChildRunRef, ControlPlaneProjectTick, CONTINUATION_PENDING_RUN_STATUS, DaemonRunChild, DaemonTickRuntimeContext, DashboardEventHub, EvidenceRequest, GhPullRequestReviewStateInspector, ISSUE_DELIVERY_CLOSEOUT_COMPLETE_TOOL_NAME, ISSUE_LABEL_ADD_TOOL_NAME, ISSUE_PROGRESS_CHECKPOINT_TOOL_NAME, ISSUE_REVIEW_CHECKPOINT_TOOL_NAME, ISSUE_REVIEW_HANDOFF_TOOL_NAME, ISSUE_REVIEW_REPAIR_COMPLETE_TOOL_NAME, ISSUE_TERMINAL_FINALIZE_TOOL_NAME, ISSUE_TRANSITION_TOOL_NAME, IssueDispatchMode, IssueRunPlan, IssueTurnContinuationGuard, ManualAttentionRequested, OPERATOR_DASHBOARD_ALIAS_ENDPOINT_PATH, OPERATOR_DASHBOARD_ENDPOINT_PATH, OperatorCodexAccountControlStatus, OperatorGitHubCliAuthority, OperatorProjectStatus, OperatorStatusSnapshot, PostReviewLaneClassification, PostReviewLaneDecision, PostReviewLaneSnapshot, PreferredRunIdentity, PrepareIssueRunContext, PublishedOperatorSnapshot, PullRequestCommitConnection, PullRequestCommitNode, PullRequestCommitPayload, PullRequestIssueCommentConnection, PullRequestIssueCommentState, PullRequestIssueCommentsNode, PullRequestPageInfo, PullRequestReactionGroup, PullRequestReactionUsersConnection, PullRequestActor, PullRequestRepository, PullRequestRepositoryOwner, PullRequestReviewConnection, PullRequestIssueCommentNode, PullRequestReviewNode, PullRequestReviewRequestConnection, PullRequestReviewState, PullRequestReviewStateInspector, PullRequestReviewStateNode, PullRequestReviewStateRepository, PullRequestReviewSummaryState, PullRequestReviewThreadConnection, PullRequestReviewThreadNode, PullRequestStatusCheckRollup, RecoveredRuntimeState, RetainedPartialProgress, RetainedReviewRunIdentity, RetryComment, RetryDispatchDecision, RetryEntry, RetryKind, RetryQueue, RunCompletionDisposition, RunSummary, RepoGateFailure, TERMINAL_GUARD_MARKER_FILE, TERMINAL_GUARDED_RUN_STATUS, TRACKER_RATE_LIMIT_WARNING, TargetIssueRunContext, EXTERNAL_REVIEW_ACTOR_LOGIN, EXTERNAL_REVIEW_PASS_PHRASE, EXTERNAL_REVIEW_REQUEST_BODY};
use crate::orchestrator::{self, ActiveChildRunContext, ActiveRunDisposition, ActiveRunReconciliation, ActiveWorkflowOverride, AgentEvidenceSource, ChildExitRetryContext, ChildRunRef, ControlPlaneProjectTick, CONTINUATION_PENDING_RUN_STATUS, DaemonRunChild, DaemonTickRuntimeContext, DashboardEventHub, EvidenceRequest, GhPullRequestReviewStateInspector, ISSUE_DELIVERY_CLOSEOUT_COMPLETE_TOOL_NAME, ISSUE_LABEL_ADD_TOOL_NAME, ISSUE_PROGRESS_CHECKPOINT_TOOL_NAME, ISSUE_REVIEW_CHECKPOINT_TOOL_NAME, ISSUE_REVIEW_HANDOFF_TOOL_NAME, ISSUE_REVIEW_REPAIR_COMPLETE_TOOL_NAME, ISSUE_TERMINAL_FINALIZE_TOOL_NAME, ISSUE_TRANSITION_TOOL_NAME, IssueDispatchMode, IssueRunPlan, IssueTurnContinuationGuard, ManualAttentionRequested, OPERATOR_DASHBOARD_ALIAS_ENDPOINT_PATH, OPERATOR_DASHBOARD_ENDPOINT_PATH, OperatorCodexAccountControlStatus, OperatorExecutionProgramStatus, OperatorGitHubCliAuthority, OperatorProjectStatus, OperatorStatusSnapshot, PostReviewLaneClassification, PostReviewLaneDecision, PostReviewLaneSnapshot, PreferredRunIdentity, PrepareIssueRunContext, PublishedOperatorSnapshot, PullRequestCommitConnection, PullRequestCommitNode, PullRequestCommitPayload, PullRequestIssueCommentConnection, PullRequestIssueCommentState, PullRequestIssueCommentsNode, PullRequestPageInfo, PullRequestReactionGroup, PullRequestReactionUsersConnection, PullRequestActor, PullRequestRepository, PullRequestRepositoryOwner, PullRequestReviewConnection, PullRequestIssueCommentNode, PullRequestReviewNode, PullRequestReviewRequestConnection, PullRequestReviewState, PullRequestReviewStateInspector, PullRequestReviewStateNode, PullRequestReviewStateRepository, PullRequestReviewSummaryState, PullRequestReviewThreadConnection, PullRequestReviewThreadNode, PullRequestStatusCheckRollup, RecoveredRuntimeState, RetainedPartialProgress, RetainedReviewRunIdentity, RetryComment, RetryDispatchDecision, RetryEntry, RetryKind, RetryQueue, RunCompletionDisposition, RunSummary, RepoGateFailure, TERMINAL_GUARD_MARKER_FILE, TERMINAL_GUARDED_RUN_STATUS, TRACKER_RATE_LIMIT_WARNING, TargetIssueRunContext, EXTERNAL_REVIEW_ACTOR_LOGIN, EXTERNAL_REVIEW_PASS_PHRASE, EXTERNAL_REVIEW_REQUEST_BODY};
#[rustfmt::skip]
use crate::prelude::Result;
#[rustfmt::skip]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ fn agent_evidence_snapshot_writes_index_blockers_capsules_and_event_stream() {
active_runs: vec![active_run.clone()],
recent_runs: vec![active_run],
history_lanes: Vec::new(),
execution_programs: Vec::new(),
queued_candidates: vec![agent_evidence_blocked_candidate()],
worktrees: operator_status_text_worktrees(),
post_review_lanes: vec![agent_evidence_missing_handoff_lane()],
Expand Down
51 changes: 51 additions & 0 deletions apps/decodex/src/orchestrator/tests/operator/status/text.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ fn operator_status_text_surfaces_github_cli_authority() {
queued_candidates: Vec::new(),
recent_runs: Vec::new(),
history_lanes: Vec::new(),
execution_programs: Vec::new(),
worktrees: Vec::new(),
post_review_lanes: Vec::new(),
};
Expand Down Expand Up @@ -72,6 +73,7 @@ fn operator_status_text_renders_human_readable_sections() {
queued_candidates: operator_status_text_queued_candidates(),
recent_runs: vec![active_run],
history_lanes: Vec::new(),
execution_programs: Vec::new(),
worktrees: operator_status_text_worktrees(),
post_review_lanes: operator_status_text_post_review_lanes(),
};
Expand Down Expand Up @@ -151,6 +153,50 @@ fn operator_status_text_renders_human_readable_sections() {
assert_recovery_worktree_roles_are_grouped(&rendered);
}

#[test]
fn operator_status_text_surfaces_execution_program_summary() {
let snapshot = OperatorStatusSnapshot {
project_id: String::from("decodex"),
run_limit: 10,
warnings: Vec::new(),
warning_details: Vec::new(),
connector_backoffs: Vec::new(),
projects: Vec::new(),
account_control: OperatorCodexAccountControlStatus {
mode: String::from("balanced"),
account_selector: None,
},
accounts: Vec::new(),
active_runs: Vec::new(),
queued_candidates: Vec::new(),
recent_runs: Vec::new(),
history_lanes: Vec::new(),
execution_programs: vec![OperatorExecutionProgramStatus {
program_id: String::from("program-853"),
source_contract_id: String::from("contract-852"),
node_count: 3,
ready_count: 1,
blocked_count: 1,
paused_count: 0,
active_count: 0,
completed_count: 1,
stale_count: 0,
queue_label_eligible_count: 1,
mapped_issue_identifiers: vec![String::from("XY-853")],
readback_warning: None,
}],
worktrees: Vec::new(),
post_review_lanes: Vec::new(),
};
let rendered = orchestrator::render_operator_status(&snapshot);

assert!(rendered.contains("Execution programs: 1"));
assert!(rendered.contains("Execution Programs"));
assert!(rendered.contains(
"program_id: program-853 source_contract_id: contract-852 nodes=3 ready=1 blocked=1 paused=0 active=0 completed=1 stale=0 queue_label_eligible=1 mapped_issues=XY-853"
));
}

#[test]
fn queue_explain_renders_candidate_reasons_without_running_dispatch() {
let (_temp_dir, config, _workflow) = temp_project_layout();
Expand Down Expand Up @@ -210,6 +256,7 @@ fn operator_status_text_explains_empty_backlog_checks() {
queued_candidates: Vec::new(),
recent_runs: Vec::new(),
history_lanes: Vec::new(),
execution_programs: Vec::new(),
worktrees: Vec::new(),
post_review_lanes: Vec::new(),
};
Expand Down Expand Up @@ -245,6 +292,7 @@ fn operator_status_text_surfaces_cleanup_blocker_pr_url() {
queued_candidates: Vec::new(),
recent_runs: Vec::new(),
history_lanes: Vec::new(),
execution_programs: Vec::new(),
worktrees: vec![orchestrator::OperatorWorktreeStatus {
issue_id: String::from("issue-3"),
issue_identifier: Some(String::from("PUB-103")),
Expand Down Expand Up @@ -312,6 +360,7 @@ fn operator_status_text_terminal_run_freshness_uses_terminal_update() {
queued_candidates: Vec::new(),
recent_runs: vec![terminal_run],
history_lanes,
execution_programs: Vec::new(),
worktrees: Vec::new(),
post_review_lanes: Vec::new(),
};
Expand Down Expand Up @@ -350,6 +399,7 @@ fn operator_status_text_active_run_without_live_activity_does_not_promote_update
queued_candidates: Vec::new(),
recent_runs: vec![active_run],
history_lanes: Vec::new(),
execution_programs: Vec::new(),
worktrees: Vec::new(),
post_review_lanes: Vec::new(),
};
Expand Down Expand Up @@ -383,6 +433,7 @@ fn operator_status_text_explains_unleased_live_running_lane() {
queued_candidates: Vec::new(),
recent_runs: vec![active_run],
history_lanes: Vec::new(),
execution_programs: Vec::new(),
worktrees: Vec::new(),
post_review_lanes: Vec::new(),
};
Expand Down
57 changes: 57 additions & 0 deletions apps/decodex/src/orchestrator/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1001,6 +1001,7 @@ struct OperatorStatusSnapshot {
active_runs: Vec<OperatorRunStatus>,
recent_runs: Vec<OperatorRunStatus>,
history_lanes: Vec<OperatorHistoryLaneStatus>,
execution_programs: Vec<OperatorExecutionProgramStatus>,
queued_candidates: Vec<OperatorQueuedIssueStatus>,
worktrees: Vec<OperatorWorktreeStatus>,
post_review_lanes: Vec<OperatorPostReviewLaneStatus>,
Expand Down Expand Up @@ -1050,6 +1051,62 @@ struct OperatorProjectStatus {
warning_count: usize,
}

#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
struct OperatorExecutionProgramStatus {
program_id: String,
source_contract_id: String,
node_count: usize,
ready_count: usize,
blocked_count: usize,
paused_count: usize,
active_count: usize,
completed_count: usize,
stale_count: usize,
queue_label_eligible_count: usize,
mapped_issue_identifiers: Vec<String>,
readback_warning: Option<String>,
}
impl OperatorExecutionProgramStatus {
fn from_summary(
record: &ExecutionProgramRecord,
summary: ExecutionProgramOperatorSummary,
) -> Self {
Self {
program_id: summary.program_id,
source_contract_id: record.source_contract_id().to_owned(),
node_count: record.program().nodes().len(),
ready_count: summary.ready_count,
blocked_count: summary.blocked_count,
paused_count: summary.paused_count,
active_count: summary.active_count,
completed_count: summary.completed_count,
stale_count: summary.stale_count,
queue_label_eligible_count: summary.queue_label_eligible_count,
mapped_issue_identifiers: summary.mapped_issue_identifiers,
readback_warning: None,
}
}

fn missing_contract(record: &ExecutionProgramRecord) -> Self {
let node_count = record.program().nodes().len();

Self {
program_id: record.program_id().to_owned(),
source_contract_id: record.source_contract_id().to_owned(),
node_count,
ready_count: 0,
blocked_count: 0,
paused_count: 0,
active_count: 0,
completed_count: 0,
stale_count: node_count,
queue_label_eligible_count: 0,
mapped_issue_identifiers: Vec::new(),
readback_warning: Some(String::from("source_decision_contract_missing")),
}
}
}

#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
struct OperatorGitHubCliAuthority {
command_path: String,
Expand Down
1 change: 1 addition & 0 deletions apps/decodex/src/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ use time::{OffsetDateTime, format_description::well_known::Rfc3339};

use crate::{
config::ServiceConfig,
execution_program::ExecutionProgram,
loop_contract::{DecisionContract, DecisionContractStatus, DecisionPromotion},
prelude::{Result, eyre},
tracker::records::{self, LinearExecutionEventRecord},
Expand Down
Loading