import type { ExtensionContext } from "@mariozechner/pi-coding-agent"; import type { ExtractedContent } from "./extract.js"; import type { SearchResult } from "./perplexity.js"; const CACHE_TTL_MS = 60 * 60 * 1000; export interface QueryResultData { query: string; answer: string; results: SearchResult[]; error: string | null; } export interface StoredSearchData { id: string; type: "search" | "fetch"; timestamp: number; queries?: QueryResultData[]; urls?: ExtractedContent[]; } const storedResults = new Map(); export function generateId(): string { return Date.now().toString(36) + Math.random().toString(36).slice(2, 8); } export function storeResult(id: string, data: StoredSearchData): void { storedResults.set(id, data); } export function getResult(id: string): StoredSearchData | null { return storedResults.get(id) ?? null; } export function getAllResults(): StoredSearchData[] { return Array.from(storedResults.values()); } export function deleteResult(id: string): boolean { return storedResults.delete(id); } export function clearResults(): void { storedResults.clear(); } function isValidStoredData(data: unknown): data is StoredSearchData { if (!data || typeof data !== "object") return false; const d = data as Record; if (typeof d.id !== "string" || !d.id) return false; if (d.type !== "search" && d.type !== "fetch") return false; if (typeof d.timestamp !== "number") return false; if (d.type === "search" && !Array.isArray(d.queries)) return false; if (d.type === "fetch" && !Array.isArray(d.urls)) return false; return true; } export function restoreFromSession(ctx: ExtensionContext): void { storedResults.clear(); const now = Date.now(); for (const entry of ctx.sessionManager.getBranch()) { if (entry.type === "custom" && entry.customType === "web-search-results") { const data = entry.data; if (isValidStoredData(data) && now - data.timestamp < CACHE_TTL_MS) { storedResults.set(data.id, data); } } } }