diff --git a/bridge-browser/src/content/tool_activity_overlay.ts b/bridge-browser/src/content/tool_activity_overlay.ts index f60130d..e623b06 100644 --- a/bridge-browser/src/content/tool_activity_overlay.ts +++ b/bridge-browser/src/content/tool_activity_overlay.ts @@ -53,11 +53,13 @@ export class ToolActivityOverlay { return; } - if (currentEntry.turn.id !== this.currentTurnId) { + const isSameTurn = currentEntry.turn.id === this.currentTurnId; + const currentScrollTop = isSameTurn ? this.getCurrentScrollTop() : 0; + const historyScrollTop = this.getHistoryScrollTop(); + if (!isSameTurn) { this.startTurn(currentEntry.turn.id); } - const historyScrollTop = this.getHistoryScrollTop(); const historyEntries = entries.slice(0, -1).reverse(); this.host.style.display = "block"; this.host.className = this.collapsed && !this.historyVisible ? "current-collapsed" : ""; @@ -70,6 +72,7 @@ export class ToolActivityOverlay { ...(this.historyVisible ? [this.createHistoryPanel(historyEntries)] : []), this.panel ); + this.restoreCurrentScrollTop(currentScrollTop); this.restoreHistoryScrollTop(historyScrollTop); this.syncTicker(snapshot.items.some((item) => item.status === "executing")); this.dragController.scheduleClamp(); @@ -209,11 +212,22 @@ export class ToolActivityOverlay { } } + private getCurrentScrollTop(): number { + if (this.collapsed) {return 0;} + return this.panel.querySelector(".list")?.scrollTop ?? 0; + } + private getHistoryScrollTop(): number { if (!this.historyVisible) {return 0;} return this.stack.querySelector(".history-list")?.scrollTop ?? 0; } + private restoreCurrentScrollTop(scrollTop: number): void { + if (this.collapsed) {return;} + const list = this.panel.querySelector(".list"); + if (list) {list.scrollTop = scrollTop;} + } + private restoreHistoryScrollTop(scrollTop: number): void { if (!this.historyVisible) {return;} const history = this.stack.querySelector(".history-list"); diff --git a/bridge-browser/test/tool_activity_overlay.test.ts b/bridge-browser/test/tool_activity_overlay.test.ts index e8110cd..36d9300 100644 --- a/bridge-browser/test/tool_activity_overlay.test.ts +++ b/bridge-browser/test/tool_activity_overlay.test.ts @@ -207,9 +207,12 @@ function testDetailedHistoryBlock(Overlay: OverlayConstructor): void { assertIncludes(historyPanel.getText(), "Run read_file", "history omitted the tool purpose"); assertIncludes(harness.panel.getText(), "Running", "current status was not kept visible"); + const currentBeforeUpdate = getRequired(harness.panel, ".list"); + currentBeforeUpdate.scrollTop = 67; const historyBeforeUpdate = getRequired(harness.stack, ".history-list"); historyBeforeUpdate.scrollTop = 41; harness.tracker.updateStatus({ requestKey: currentKey }, "awaiting_approval"); + assertEqual(getRequired(harness.panel, ".list").scrollTop, 67, "live update reset current scroll"); assertEqual(getRequired(harness.stack, ".history-list").scrollTop, 41, "live update reset history scroll"); assertIncludes(harness.panel.getText(), "Approval", "current approval state did not update");