perf(panel): cached info and history paint first, lazy markdown up the thread, background prefetch
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
import type { ContentBlock, HistoryMessage } from "$lib/api/types";
|
||||
|
||||
const MAX_BYTES = 250_000;
|
||||
const TAIL = 200;
|
||||
|
||||
function slim(message: HistoryMessage): HistoryMessage {
|
||||
if (typeof message.content === "string") {
|
||||
return message;
|
||||
}
|
||||
const content: ContentBlock[] = message.content.map((block) =>
|
||||
block.type === "tool_result" ? { ...block, content: "" } : block
|
||||
);
|
||||
return { ...message, content };
|
||||
}
|
||||
|
||||
// The tail of a thread as it is worth keeping between opens: tool results
|
||||
// dropped (hidden by default, and the bulk of the bytes), then trimmed from
|
||||
// the head until it fits a slice of localStorage.
|
||||
export function cacheableHistory(messages: HistoryMessage[]): HistoryMessage[] {
|
||||
let tail = messages.slice(-TAIL).map(slim);
|
||||
while (tail.length > 1 && JSON.stringify(tail).length > MAX_BYTES) {
|
||||
tail = tail.slice(Math.ceil(tail.length / 4));
|
||||
}
|
||||
return tail;
|
||||
}
|
||||
|
||||
export const historyKey = (id: string) => `history:${id}`;
|
||||
export const infoKey = (id: string) => `info:${id}`;
|
||||
Reference in New Issue
Block a user