perf: overhaul session loading, caching, and runtime isolation (#2360)

Improve OpenChamber responsiveness under large session workloads while fixing
cache, synchronization, and persistence correctness across runtimes, projects,
directories, and worktrees.

- prioritize selected and visible sessions during bootstrap and defer
  non-critical enrichment work
- reduce redundant message loading, event processing, store publication, and
  hidden sidebar work
- prevent stale session and message requests from overwriting newer
  authoritative state
- preserve existing data when authoritative fetches fail instead of treating
  failures as successful empty responses
- scope session materialization, messages, drafts, queues, todos, pins,
  permissions, folders, tabs, Git state, and pull request data by runtime and
  directory identity
- harden runtime switching, reconnect, cleanup, mutation reconciliation, and
  persisted-state ordering
- preserve live subagent Task linkage when metadata arrives after an older
  message request or while streaming parts are suspended
- coalesce overlapping tail refreshes without losing newer refresh demand
- improve cold-session loading by moving deferrable work out of the critical
  bootstrap path
- isolate URL authentication, mobile credentials, native secrets, and other
  runtime-owned state across endpoint changes
- bound long-lived caches and remove avoidable allocations from event and
  rendering hot paths
- limit virtualization to archive collections where it improves rendering
  without disrupting active sidebar layout
- stabilize session folders, pin ordering, expanded state, and persisted
  sidebar behavior
- open skill files through the same secure editor and outside-workspace grant
  flow used by file navigation, including worktree sessions
- expand regression coverage for stale completions, runtime collisions,
  reconnect behavior, persistence races, authoritative empty results, and
  subagent refresh ordering
- document the updated synchronization, cache ownership, performance, and
  runtime-isolation invariants
This commit is contained in:
Bohdan Triapitsyn
2026-07-21 20:52:20 +03:00
committed by GitHub
parent 485efc7117
commit 85400459e9
197 changed files with 10835 additions and 3400 deletions
+26 -4
View File
@@ -217,6 +217,21 @@ export function applyDirectoryEvent(
onSetSessionTodo?: (sessionID: string, todos: Todo[] | undefined) => void
},
): DirectoryEventResult {
const markSessionEvent = (sessionID: string, deleted: boolean) => {
const revision = (draft.sessionRevision ?? 0) + 1
draft.sessionRevision = revision
draft.sessionListSource = "live"
draft.sessionEventRevision = draft.sessionEventRevision ?? {}
draft.sessionDeletedRevision = draft.sessionDeletedRevision ?? {}
if (deleted) {
draft.sessionDeletedRevision[sessionID] = revision
delete draft.sessionEventRevision[sessionID]
} else {
draft.sessionEventRevision[sessionID] = revision
delete draft.sessionDeletedRevision[sessionID]
}
}
switch (event.type) {
case "server.instance.disposed": {
callbacks?.onRefresh?.("")
@@ -237,6 +252,7 @@ export function applyDirectoryEvent(
trimSessions(draft)
if (!info.parentID) draft.sessionTotal += 1
}
markSessionEvent(info.id, false)
return true
}
@@ -256,6 +272,7 @@ export function applyDirectoryEvent(
if (result.found) sessions.splice(result.index, 1)
cleanupSessionCaches(draft, info.id, callbacks?.onSetSessionTodo)
if (!info.parentID) draft.sessionTotal = Math.max(0, draft.sessionTotal - 1)
markSessionEvent(info.id, true)
return true
}
@@ -265,16 +282,21 @@ export function applyDirectoryEvent(
sessions.splice(result.index, 0, info)
trimSessions(draft)
}
markSessionEvent(info.id, false)
return true
}
case "session.deleted": {
const info = (event.properties as { info: Session }).info
const sessions = draft.session
const result = Binary.search(sessions, info.id, (s) => s.id)
const props = event.properties as { info?: Session; sessionID?: string }
const sessionID = props.info?.id ?? props.sessionID
if (!sessionID) return false
const result = Binary.search(sessions, sessionID, (s) => s.id)
const info = props.info ?? (result.found ? sessions[result.index] : undefined)
if (result.found) sessions.splice(result.index, 1)
cleanupSessionCaches(draft, info.id, callbacks?.onSetSessionTodo)
if (!info.parentID) draft.sessionTotal = Math.max(0, draft.sessionTotal - 1)
cleanupSessionCaches(draft, sessionID, callbacks?.onSetSessionTodo)
if (!info?.parentID) draft.sessionTotal = Math.max(0, draft.sessionTotal - 1)
markSessionEvent(sessionID, true)
return true
}