openclaw - 💡(How to fix) Fix [Bug]: WebChat UI: "In progress" status persists after model response generation

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

After the model finishes its reply, the WebChat UI displays the "Done" indicator. However, after a few seconds, it incorrectly reverts to the "In progress" status.

Error Message

Bug Traceback

Root Cause

Root Cause: When Im re-fetches the session list, a race condition in the backend causes it to return the stale running status. As a result, xd()'s correction logic is bypassed due to ld()'s premature exit, leaving the erroneous state persisted.

Fix Action

Fix / Workaround

I found that updating the .../node_modules/openclaw/dist/control-ui/assets/index-89Mm3xEP.js file does the trick. Here's the patch:

Code Example



---

async function Im(e,t,n){await(async()=>{let r=new Map((e.sessionsResult?.sessions??[]).map(e=>[e.key,e])),i=n?.includeGlobal??e.sessionsIncludeGlobal,a=n?.includeUnknown??e.sessionsIncludeUnknown,o=n?.showArchived??e.sessionsShowArchived,s=o?0:n?.activeMinutes??Vc(e.sessionsFilterActive,0),c=n?.limit??Vc(e.sessionsFilterLimit,0),l={includeGlobal:i,includeUnknown:a,configuredAgentsOnly:n?.configuredAgentsOnly??!0},u=n?.agentId?.trim();u&&(l.agentId=u),s>0&&(l.activeMinutes=s),c>0&&(l.limit=c);let d=typeof n?.offset==`number`&&Number.isFinite(n.offset)?Math.max(0,Math.floor(n.offset)):0;d>0&&(l.offset=d);let f=n?.search?.trim();f&&(l.search=f);let p=await t.request(`sessions.list`,l);if(p){let t=wm(p,{showArchived:o});e.sessionsResult=n?.append===!0&&d>0&&e.sessionsResult?Tm(e.sessionsResult,t):t,
// ------> Insert fix snippet <------
lm(e)&&xd(e,{publishRunStatus:n?.publishChatRunStatus!==!1});let i=new Set(e.sessionsResult.sessions.map(e=>e.key));for(let t of Object.keys(e.sessionsCheckpointItemsByKey))i.has(t)||Om(e,t);let a=!1;for(let t of e.sessionsResult.sessions)Dm(r.get(t.key))!==Dm(t)&&(Om(e,t.key),e.sessionsExpandedCheckpointKey===t.key&&(a=!0));let s=e.sessionsExpandedCheckpointKey;s&&i.has(s)&&(a||!e.sessionsCheckpointItemsByKey[s])&&await km(e,s)}})().catch(t=>{if(!Yt(t)){e.sessionsError=String(t);return}e.sessionsResult=null,e.sessionsError=Xt(`sessions`)})}

---

!e.chatRunId&&!e.chatStream&&(()=>{let s=e.sessionsResult?.sessions;if(!s)return;let n=s.find(s=>s.key===e.sessionKey);n&&(n.hasActiveRun||"running"===n.status)&&(e.sessionsResult={...e.sessionsResult,sessions:s.map(s=>s.key!==e.sessionKey?s:{...s,hasActiveRun:!1,status:"running"===s.status?"done":s.status,endedAt:s.endedAt??Date.now()})})})(),

---

Large language model inference completes
yd() clears chatRunId, sets chatRunStatus=done
vk() triggers Fm()Im() re-fetches sessions.list
Backend returns session.status=running (race condition — backend hasn't updated yet)
      → sessionsResult gets overwritten, session reverts to running
xd() should have corrected this, but ld() determines the session is still running and exits early
5 seconds later, the hd timer fires requestUpdate()
Gm() sees session=running → canAbort=true
              → gD returns o={phase:'in-progress'}
                → vE renders an anomalous in-progress element
RAW_BUFFERClick to expand / collapse

Bug type

Regression (worked before, now fails)

Beta release blocker

No

Summary

After the model finishes its reply, the WebChat UI displays the "Done" indicator. However, after a few seconds, it incorrectly reverts to the "In progress" status.

Steps to reproduce

Just ask a question in the webchat UI and wait for a response.

Expected behavior

The "In progress" indicator will no longer be displayed in the webchat UI once the model finishes replying.

Actual behavior

The "In progress" indicator incorrectly reappears in the webchat UI a few seconds after the model has finished its reply.

OpenClaw version

2026.5.27

Operating system

Debian 12

Install method

npm global

Model

OpenAI-compatible

Provider / routing chain

openclaw

Additional provider/model setup details

No response

Logs, screenshots, and evidence

Impact and severity

No response

Additional information

This issue was not present in version 2026.5.20, but it persists in versions 2026.5.22, 2026.5.26, and 2026.5.27.

I found that updating the .../node_modules/openclaw/dist/control-ui/assets/index-89Mm3xEP.js file does the trick. Here's the patch:

index-89Mm3xEP.js

async function Im(e,t,n){await(async()=>{let r=new Map((e.sessionsResult?.sessions??[]).map(e=>[e.key,e])),i=n?.includeGlobal??e.sessionsIncludeGlobal,a=n?.includeUnknown??e.sessionsIncludeUnknown,o=n?.showArchived??e.sessionsShowArchived,s=o?0:n?.activeMinutes??Vc(e.sessionsFilterActive,0),c=n?.limit??Vc(e.sessionsFilterLimit,0),l={includeGlobal:i,includeUnknown:a,configuredAgentsOnly:n?.configuredAgentsOnly??!0},u=n?.agentId?.trim();u&&(l.agentId=u),s>0&&(l.activeMinutes=s),c>0&&(l.limit=c);let d=typeof n?.offset==`number`&&Number.isFinite(n.offset)?Math.max(0,Math.floor(n.offset)):0;d>0&&(l.offset=d);let f=n?.search?.trim();f&&(l.search=f);let p=await t.request(`sessions.list`,l);if(p){let t=wm(p,{showArchived:o});e.sessionsResult=n?.append===!0&&d>0&&e.sessionsResult?Tm(e.sessionsResult,t):t,
// ------> Insert fix snippet <------
lm(e)&&xd(e,{publishRunStatus:n?.publishChatRunStatus!==!1});let i=new Set(e.sessionsResult.sessions.map(e=>e.key));for(let t of Object.keys(e.sessionsCheckpointItemsByKey))i.has(t)||Om(e,t);let a=!1;for(let t of e.sessionsResult.sessions)Dm(r.get(t.key))!==Dm(t)&&(Om(e,t.key),e.sessionsExpandedCheckpointKey===t.key&&(a=!0));let s=e.sessionsExpandedCheckpointKey;s&&i.has(s)&&(a||!e.sessionsCheckpointItemsByKey[s])&&await km(e,s)}})().catch(t=>{if(!Yt(t)){e.sessionsError=String(t);return}e.sessionsResult=null,e.sessionsError=Xt(`sessions`)})}

Insert fix snippet

!e.chatRunId&&!e.chatStream&&(()=>{let s=e.sessionsResult?.sessions;if(!s)return;let n=s.find(s=>s.key===e.sessionKey);n&&(n.hasActiveRun||"running"===n.status)&&(e.sessionsResult={...e.sessionsResult,sessions:s.map(s=>s.key!==e.sessionKey?s:{...s,hasActiveRun:!1,status:"running"===s.status?"done":s.status,endedAt:s.endedAt??Date.now()})})})(),

Bug Traceback

Large language model inference completes
  → yd() clears chatRunId, sets chatRunStatus=done
  → vk() triggers Fm() → Im() re-fetches sessions.list
    → Backend returns session.status=running (race condition — backend hasn't updated yet)
      → sessionsResult gets overwritten, session reverts to running
        → xd() should have corrected this, but ld() determines the session is still running and exits early
          → 5 seconds later, the hd timer fires requestUpdate()
            → Gm() sees session=running → canAbort=true
              → gD returns o={phase:'in-progress'}
                → vE renders an anomalous in-progress element

Root Cause: When Im re-fetches the session list, a race condition in the backend causes it to return the stale running status. As a result, xd()'s correction logic is bypassed due to ld()'s premature exit, leaving the erroneous state persisted.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

FAQ

Expected behavior

The "In progress" indicator will no longer be displayed in the webchat UI once the model finishes replying.

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

openclaw - 💡(How to fix) Fix [Bug]: WebChat UI: "In progress" status persists after model response generation