This commit is contained in:
2026-01-18 03:18:48 -08:00
parent 3f874af54a
commit aa675a625a
8 changed files with 508 additions and 161 deletions

View File

@@ -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: