import { computed, type Default, NAME, pattern, patternTool, type PatternToolResult, UI, type VNode, wish, Writable, } from "commonfabric"; export type SuggestionHistoryEntry = { result: Writable; messages: any[]; timestamp: string; }; type Input = Record; export type Output = { entries: SuggestionHistoryEntry[]; search: PatternToolResult<{ entries: SuggestionHistoryEntry[] }>; [UI]: VNode; }; function extractText(content: any): string { if (typeof content === "string") return content; if (Array.isArray(content)) { return content .filter((p: any) => p.type === "text" && p.text) .map((p: any) => p.text) .join(" "); } return ""; } function messageText(entry: SuggestionHistoryEntry): string { return (entry.messages ?? []) .filter((m: any) => m.role === "user") .map((m: any) => extractText(m.content)) .join(" "); } export const searchPattern = pattern< { query: string; entries: SuggestionHistoryEntry[] }, SuggestionHistoryEntry[] >(({ query, entries }) => { return computed(() => { if (!query || query.trim() === "") return entries; const q = query.toLowerCase().trim(); return entries.filter( (entry: SuggestionHistoryEntry) => messageText(entry).toLowerCase().includes(q) || (entry.timestamp ?? "").includes(q), ); }); }); const SuggestionHistory = pattern(() => { const { result: entries } = wish>({ query: "#suggestions", }); const allEntries = computed(() => entries ?? []); return { [NAME]: "Suggestion History", [UI]: ( {allEntries.map((entry: SuggestionHistoryEntry) => (
{entry.timestamp}
))}
), entries: allEntries, search: patternTool(searchPattern, { entries: allEntries }), }; }); export default SuggestionHistory;