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:
committed by
GitHub
parent
485efc7117
commit
85400459e9
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user