import type { Message, Part, PermissionRequest, QuestionRequest, SessionStatus, SnapshotFileDiff, Todo, } from "@opencode-ai/sdk/v2/client" export const SESSION_CACHE_LIMIT = 40 type SessionCache = { session_status: Record session_diff: Record todo: Record message: Record part: Record permission: Record question: Record } export function dropSessionCaches(store: SessionCache, sessionIDs: Iterable) { const stale = new Set(Array.from(sessionIDs).filter(Boolean)) if (stale.size === 0) return for (const key of Object.keys(store.part)) { const parts = store.part[key] if (!parts?.some((part) => stale.has(part?.sessionID ?? ""))) continue delete store.part[key] } for (const sessionID of stale) { delete store.message[sessionID] delete store.todo[sessionID] delete store.session_diff[sessionID] delete store.session_status[sessionID] delete store.permission[sessionID] delete store.question[sessionID] } } export function pickSessionCacheEvictions(input: { seen: Set keep: string limit: number preserve?: Iterable }) { const stale: string[] = [] const keep = new Set([input.keep, ...Array.from(input.preserve ?? [])]) if (input.seen.has(input.keep)) input.seen.delete(input.keep) input.seen.add(input.keep) for (const id of input.seen) { if (input.seen.size - stale.length <= input.limit) break if (keep.has(id)) continue stale.push(id) } for (const id of stale) { input.seen.delete(id) } return stale }