fix(web): reset live metrics between connections

This commit is contained in:
Hypatia May
2026-07-28 20:28:01 +08:00
parent 47205cbb82
commit ef12895cf1
8 changed files with 178 additions and 5 deletions
@@ -143,6 +143,7 @@ export function apply(ctx: Context): void {
workspaces.handleConnected()
ctx.emit('connection/reset')
},
onDisconnected: () => { sessions.handleReconnecting() },
})
ctx.effect(() => () => { loop.stop() }, 'runtime: connection stream loop')
}
@@ -430,6 +430,12 @@ export class SessionManager {
for (const session of this.sessions.values()) void session.resync()
}
/** Before a replacement stream generation, discard values the Host does not replay. */
handleReconnecting(): void {
this.modelRequestContextWindows.clear()
for (const session of this.sessions.values()) session.handleReconnecting()
}
private buildListSnapshot(): SessionListSnapshot {
const merged: TitledSessionSummary[] = this.summaries.map((summary) => {
// List rows read the generic 'title' projection key (host-computed unit
@@ -393,6 +393,11 @@ export class SessionsService {
this.manager.handleConnected()
}
/** Clear connection-local Session state before the next stream generation starts. */
handleReconnecting(): void {
this.manager.handleReconnecting()
}
/**
* Create a session on the host. Resolution guarantee: by the time the
* promise resolves, the created session is in the list store and
@@ -481,6 +481,14 @@ export class Session implements ObservableSnapshot<ConversationSnapshot> {
this.notifier.markDirty()
}
/** Connection-loss boundary: clear values that are not replayed before the next stream starts. */
handleReconnecting(): void {
if (this.metrics === null && this.contextWindow === undefined) return
this.metrics = null
this.contextWindow = undefined
this.notifier.markDirty()
}
/** host/session-removed relay: flag the resident snapshot and clear connection-local capacity. */
handleRemoved(): void {
const changed = !this.removed || this.contextWindow !== undefined