d
This commit is contained in:
121
cmdnat/worker.py
121
cmdnat/worker.py
@@ -200,7 +200,8 @@ def _render_worker_list(db, status_filter: str | None, limit: int) -> int:
|
||||
date_str = _extract_date(started)
|
||||
start_time = _format_event_timestamp(started)
|
||||
end_time = _format_event_timestamp(ended)
|
||||
worker_id = str(worker.get("worker_id") or worker.get("id") or "unknown")
|
||||
worker_id_value = worker.get("worker_id") or worker.get("id")
|
||||
worker_id = str(worker_id_value) if worker_id_value is not None else ""
|
||||
status = str(worker.get("status") or "unknown")
|
||||
result_state = str(worker.get("result") or "")
|
||||
status_label = status
|
||||
@@ -223,11 +224,17 @@ def _render_worker_list(db, status_filter: str | None, limit: int) -> int:
|
||||
if description and description != error_message:
|
||||
columns.append(("Details", description[:200]))
|
||||
|
||||
selection_args = None
|
||||
if worker_id:
|
||||
selection_args = ["-id", worker_id]
|
||||
item = {
|
||||
"columns": columns,
|
||||
"__worker_metadata": worker,
|
||||
"_selection_args": ["-id", worker.get("worker_id")],
|
||||
"worker_id": worker_id,
|
||||
}
|
||||
if selection_args:
|
||||
item["_selection_args"] = list(selection_args)
|
||||
item["selection_args"] = list(selection_args)
|
||||
ctx.emit(item)
|
||||
log(
|
||||
f"Worker {worker_id[:8]} status={status_label} pipe={pipe_display} "
|
||||
@@ -282,47 +289,81 @@ def _resolve_worker_record(db, payload: Any) -> Dict[str, Any] | None:
|
||||
|
||||
|
||||
def _emit_worker_detail(worker: Dict[str, Any], events: List[Dict[str, Any]]) -> None:
|
||||
stdout_content = worker.get("stdout", "") or ""
|
||||
rows_emitted = False
|
||||
|
||||
lines = stdout_content.splitlines()
|
||||
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
if not line:
|
||||
continue
|
||||
|
||||
timestamp = ""
|
||||
level = "INFO"
|
||||
message = line
|
||||
|
||||
try:
|
||||
parts = line.split(" - ", 3)
|
||||
if len(parts) >= 4:
|
||||
ts_str, _, lvl, msg = parts
|
||||
timestamp = _format_event_timestamp(ts_str)
|
||||
level = lvl
|
||||
message = msg
|
||||
elif len(parts) == 3:
|
||||
ts_str, lvl, msg = parts
|
||||
timestamp = _format_event_timestamp(ts_str)
|
||||
level = lvl
|
||||
message = msg
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
item = {
|
||||
"columns": [
|
||||
("Time",
|
||||
timestamp),
|
||||
("Level",
|
||||
level),
|
||||
("Message",
|
||||
message),
|
||||
]
|
||||
def _emit_columns(columns: List[tuple[str, str]]) -> None:
|
||||
nonlocal rows_emitted
|
||||
payload = {
|
||||
"columns": columns,
|
||||
"_skip_metadata_propagation": True,
|
||||
}
|
||||
ctx.emit(item)
|
||||
ctx.emit(payload)
|
||||
rows_emitted = True
|
||||
|
||||
# Events are already always derived from stdout for now.
|
||||
if events:
|
||||
for event in events:
|
||||
message = _normalize_text(event.get("message"))
|
||||
if not message:
|
||||
continue
|
||||
|
||||
level = _normalize_text(event.get("event_type") or event.get("channel") or "INFO")
|
||||
step = _normalize_text(event.get("step"))
|
||||
if step:
|
||||
message = f"[{step}] {message}"
|
||||
|
||||
timestamp = _format_event_timestamp(event.get("created_at") or "")
|
||||
|
||||
_emit_columns([
|
||||
("Time", timestamp),
|
||||
("Level", level or "INFO"),
|
||||
("Message", message),
|
||||
])
|
||||
|
||||
if not rows_emitted:
|
||||
stdout_content = worker.get("stdout", "") or ""
|
||||
lines = stdout_content.splitlines()
|
||||
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
if not line:
|
||||
continue
|
||||
|
||||
timestamp = ""
|
||||
level = "INFO"
|
||||
message = line
|
||||
|
||||
try:
|
||||
parts = line.split(" - ", 3)
|
||||
if len(parts) >= 4:
|
||||
ts_str, _, lvl, msg = parts
|
||||
timestamp = _format_event_timestamp(ts_str)
|
||||
level = lvl
|
||||
message = msg
|
||||
elif len(parts) == 3:
|
||||
ts_str, lvl, msg = parts
|
||||
timestamp = _format_event_timestamp(ts_str)
|
||||
level = lvl
|
||||
message = msg
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
_emit_columns([
|
||||
("Time", timestamp),
|
||||
("Level", level),
|
||||
("Message", message),
|
||||
])
|
||||
|
||||
if not rows_emitted:
|
||||
fallback = (
|
||||
_normalize_text(worker.get("error_message"))
|
||||
or _normalize_text(worker.get("description"))
|
||||
or "No log output captured for this worker."
|
||||
)
|
||||
_emit_columns([
|
||||
("Time", ""),
|
||||
("Level", "INFO"),
|
||||
("Message", fallback),
|
||||
])
|
||||
|
||||
|
||||
def _summarize_pipe(pipe_value: Any, limit: int = 200) -> str:
|
||||
|
||||
Reference in New Issue
Block a user