{% from "_macros.html" import icon %} {# The chat's background jobs, above the composer (spec 2.0.0): one row per running job -- a helper this server started with `task background: true`, or, on a device chat, a command or a subagent the LLeMbas CLI runs in the background. What the LLeMbas CLI's `/jobs` shows, here. The element is always there, empty or not, so the stream's out-of-band frame (`oob`, carried by the `jobs` SSE event) always has somewhere to land -- the same arrangement as the plan panel. While it has rows it polls itself every ten seconds: the reply's stream ends at `done` and a device's later `job` events reach no reply, so a job that ends after the turn would otherwise stay on screen until the next page load. With no rows there is nothing to poll for, and the attribute is left off rather than firing into a hidden element. Every row is a fixed grid: icon, what (the one column that gives), state and time in a fixed-width column, then the buttons. The description is cut, not wrapped, so twelve rows line up whatever each one says. Everything in a row came from a model or off a device, and Jinja escapes it. `hx-target="this"` on the poll is load-bearing: this sits near the composer form, which carries `hx-target="#thread"`, and an inherited target put a strip into the transcript once before. #} {% set running = jobs | selectattr("state", "equalto", "running") | list %}