| 184 | }) |
| 185 | |
| 186 | const remember = (session: Session) => { |
| 187 | setData("info", session.id, reconcile(session)) |
| 188 | infoSeen.delete(session.id) |
| 189 | infoSeen.add(session.id) |
| 190 | if (infoSeen.size > sessionInfoLimit) { |
| 191 | const preserve = new Set([ |
| 192 | ...pinned.keys(), |
| 193 | ...requests.keys(), |
| 194 | ...inflight.keys(), |
| 195 | ...inflightDiff.keys(), |
| 196 | ...inflightTodo.keys(), |
| 197 | ...messageLoads.keys(), |
| 198 | ...optimistic.keys(), |
| 199 | ...Object.entries(data.permission) |
| 200 | .filter(([, items]) => items.length > 0) |
| 201 | .map(([sessionID]) => sessionID), |
| 202 | ...Object.entries(data.question) |
| 203 | .filter(([, items]) => items.length > 0) |
| 204 | .map(([sessionID]) => sessionID), |
| 205 | ...Object.entries(data.session_status) |
| 206 | .filter(([, status]) => status.type !== "idle") |
| 207 | .map(([sessionID]) => sessionID), |
| 208 | ]) |
| 209 | for (const sessionID of preserve) { |
| 210 | let current = data.info[sessionID] |
| 211 | while (current) { |
| 212 | preserve.add(current.id) |
| 213 | current = current.parentID ? data.info[current.parentID] : undefined |
| 214 | } |
| 215 | } |
| 216 | const stale: string[] = [] |
| 217 | for (const sessionID of infoSeen) { |
| 218 | if (infoSeen.size - stale.length <= sessionInfoLimit) break |
| 219 | if (!preserve.has(sessionID)) stale.push(sessionID) |
| 220 | } |
| 221 | stale.forEach((sessionID) => infoSeen.delete(sessionID)) |
| 222 | stale.forEach((sessionID) => generations.delete(sessionID)) |
| 223 | setData( |
| 224 | "info", |
| 225 | produce((draft) => stale.forEach((sessionID) => delete draft[sessionID])), |
| 226 | ) |
| 227 | } |
| 228 | return session |
| 229 | } |
| 230 | |
| 231 | const resolve = (sessionID: string, options?: { force?: boolean }) => { |
| 232 | const cached = data.info[sessionID] |