export interface ResearchLog { timestamp: string; message: string; } /** Lifecycle of a single section of the research plan. */ export type PlanStatus = "planned" | "in_progress" | "completed"; /** Lifecycle of the overall research run. */ export type ResearchStatus = "not_started" | "in_progress" | "completed"; export interface ResearchPlan { [key: string]: { description: string; sources: string[]; status: PlanStatus; }; } /** * A saved page/API response, addressable at `research://resource/{id}`. * * `url` is optional because `research-with-keywords` stores an aggregate of * several searches, which has no single source URL. `title` and `source` are * optional because the raw `fetch-content` path does not know either. */ export interface ResearchResource { url?: string; format: string; content: string; title?: string; source?: string; fetchedAt: string; } export interface ResearchData { tokenName: string; tokenTicker: string; researchPlan: ResearchPlan; searchResults: Record; technicalData: Record; marketData: Record; socialData: Record; newsData: unknown[]; teamData: Record; relatedTokens: unknown[]; resources: Record; researchData: Record; status: ResearchStatus; logs: ResearchLog[]; } export declare class ResearchStorage { private dataDir; private currentResearch; constructor(dataDir?: string); private ensureDataDir; startNewResearch(tokenName: string, tokenTicker: string): void; getCurrentResearch(): ResearchData; getSection(section: K): ResearchData[K]; updateSection(section: K, data: ResearchData[K]): void; addToSection(section: K, data: Partial): void; getResource(resourceId: string): ResearchResource | null; getAllResources(): Record; addLogEntry(message: string): void; completeResearch(): void; saveCurrentResearch(): Promise; } export default ResearchStorage;