import { api } from "../lib/api.js"; import { on } from "../lib/bus.js"; class RunTimeline extends HTMLElement { constructor() { super(); this.attachShadow({ mode: "open" }); this.chatId = null; this.shadowRoot.innerHTML = `
Conversación
Seleccioná una conversación.
Último run (raw)
Invariantes
`; } connectedCallback() { this._unsubSel = on("ui:selectedChat", async ({ chat_id }) => { this.chatId = chat_id; await this.loadLatest(); }); this._unsubRun = on("run:created", (run) => { if (this.chatId && run.chat_id === this.chatId) { this.show(run); } }); } disconnectedCallback() { this._unsubSel?.(); this._unsubRun?.(); } async loadLatest() { this.shadowRoot.getElementById("chat").textContent = this.chatId || "—"; this.shadowRoot.getElementById("meta").textContent = "Cargando…"; const data = await api.runs({ chat_id: this.chatId, limit: 1 }); const run = (data.items || [])[0]; if (!run) { this.shadowRoot.getElementById("meta").textContent = "Sin runs aún."; this.shadowRoot.getElementById("run").textContent = "—"; this.shadowRoot.getElementById("inv").textContent = "—"; return; } this.show(run); } show(run) { this.shadowRoot.getElementById("chat").textContent = run.chat_id; this.shadowRoot.getElementById("meta").textContent = `run_id=${run.run_id} • ${run.latency_ms}ms • ${new Date(run.ts).toLocaleString()}`; this.shadowRoot.getElementById("run").textContent = JSON.stringify(run, null, 2); this.shadowRoot.getElementById("inv").textContent = JSON.stringify(run.invariants, null, 2); } } customElements.define("run-timeline", RunTimeline);