This commit is contained in:
2026-03-19 13:08:15 -07:00
parent 5cbc2c09df
commit cc9c1850a8
7 changed files with 340 additions and 55 deletions

View File

@@ -4,6 +4,7 @@ Pipeline execution context and state management for cmdlet.
from __future__ import annotations
import sys
import time
from contextlib import contextmanager
from dataclasses import dataclass, field
from contextvars import ContextVar
@@ -102,6 +103,7 @@ class PipelineState:
ui_library_refresh_callback: Optional[Any] = None
pipeline_stop: Optional[Dict[str, Any]] = None
live_progress: Any = None
last_execution_result: Dict[str, Any] = field(default_factory=dict)
def reset(self) -> None:
self.current_context = None
@@ -127,6 +129,7 @@ class PipelineState:
self.ui_library_refresh_callback = None
self.pipeline_stop = None
self.live_progress = None
self.last_execution_result = {}
# ContextVar for per-run state (prototype)
@@ -315,6 +318,29 @@ def load_value(key: str, default: Any = None) -> Any:
return current
def set_last_execution_result(
*,
status: str,
error: str = "",
command_text: str = "",
) -> None:
state = _get_pipeline_state()
text_status = str(status or "").strip().lower() or "unknown"
state.last_execution_result = {
"status": text_status,
"success": text_status == "completed",
"error": str(error or "").strip(),
"command_text": str(command_text or "").strip(),
"finished_at": time.time(),
}
def get_last_execution_result() -> Dict[str, Any]:
state = _get_pipeline_state()
payload = state.last_execution_result
return dict(payload) if isinstance(payload, dict) else {}
def set_pending_pipeline_tail(
stages: Optional[Sequence[Sequence[str]]],
source_command: Optional[str] = None
@@ -3042,3 +3068,11 @@ class PipelineExecutor:
f"Pipeline {pipeline_status}: {pipeline_error or ''}")
except Exception:
logger.exception("Failed to log final pipeline status (pipeline_session=%r)", getattr(pipeline_session, 'worker_id', None))
try:
set_last_execution_result(
status=pipeline_status,
error=pipeline_error,
command_text=pipeline_text,
)
except Exception:
logger.exception("Failed to record last execution result for pipeline")