Re-add pi-web-access
This commit is contained in:
71
pi/files/agent/extensions/pi-web-access/storage.ts
Normal file
71
pi/files/agent/extensions/pi-web-access/storage.ts
Normal file
@@ -0,0 +1,71 @@
|
||||
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<string, StoredSearchData>();
|
||||
|
||||
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<string, unknown>;
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user