diff options
Diffstat (limited to 'desktop/assistant/Assistant.qml')
| -rw-r--r-- | desktop/assistant/Assistant.qml | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/desktop/assistant/Assistant.qml b/desktop/assistant/Assistant.qml index a04a24b..d143219 100644 --- a/desktop/assistant/Assistant.qml +++ b/desktop/assistant/Assistant.qml @@ -38,6 +38,9 @@ Scope { property var results: [] readonly property bool busy: root.state !== "idle" + // A daemon gone mid-reply sends no idle; its hello on return redraws. + onConnectedChanged: if (!root.connected) { root.state = "idle"; root.runningTool = ""; } + // One row per turn. tools is a comma-joined string: a ListModel role // holding an array becomes a nested model, which a Repeater can read but // setProperty cannot append to. @@ -107,6 +110,7 @@ Scope { switch (e.type) { case "hello": root.state = e.state; + root.runningTool = e.state === "tool" ? e.tool : ""; root.model = e.model ?? ""; root.ctxUsed = e.ctx_used; root.ctxMax = e.ctx_max; @@ -122,11 +126,10 @@ Scope { case "token": root.bufReply += e.delta; break; case "tool": root.flush(); - if (!e.done && i >= 0) { + if (!e.done && i >= 0 && turns.get(i).live) { const t = turns.get(i).tools; turns.setProperty(i, "tools", t ? t + "," + e.name : e.name); } - root.runningTool = e.done ? "" : e.name; break; case "done": root.flush(); @@ -135,19 +138,22 @@ Scope { turns.setProperty(i, "stopped", e.stopped === true); } if (!e.stopped) root.convId = e.id; - root.runningTool = ""; break; case "error": - root.flush(); - if (i >= 0 && turns.get(i).live) { + // Only an error marked turn ended the reply. A command error, + // perhaps another client's, leaves a streaming reply alone. + if (e.turn && i >= 0 && turns.get(i).live) { + root.flush(); turns.setProperty(i, "error", e.message); turns.setProperty(i, "live", false); } else { root.notice = e.message; } - root.runningTool = ""; break; - case "state": root.state = e.state; break; + case "state": + root.state = e.state; + root.runningTool = e.state === "tool" ? e.tool : ""; + break; case "ctx": root.ctxUsed = e.used; root.ctxMax = e.max; break; case "conversations": root.convs = e.items; break; case "results": root.results = e.items; break; |
