@kareemaly/researcher
Version:
CLI tool for web research
125 lines (124 loc) • 3.08 kB
TypeScript
export type SearchType = "web" | "news" | "academic";
export interface SearchOptions {
type?: SearchType;
location?: string;
language?: string;
limit?: number;
}
export interface SearchResult {
id: string;
timestamp: number;
query: string;
type: string;
location?: string;
language?: string;
results: SearchResultItem[];
}
export interface SearchResultItem {
title: string;
url: string;
snippet?: string;
language?: string;
published?: string;
}
export interface ProcessedContent {
url: string;
title: string;
text: string;
html: string;
markdown: string;
metadata: {
title?: string;
description?: string;
keywords?: string[];
author?: string;
published?: string;
};
}
export interface StorageConfig {
basePath: string;
createDirectories?: boolean;
}
export interface StorageStats {
totalSizeBytes: number;
searchCount: number;
contentCount: number;
}
export interface IStorage {
initialize(): Promise<void>;
saveSearch(search: SearchResult): Promise<string>;
saveContent(searchId: string, content: ProcessedContent): Promise<void>;
getSearch(id: string): Promise<SearchResult | null>;
getContent(searchId: string, url: string): Promise<ProcessedContent | null>;
listSearches(): Promise<SearchResult[]>;
getStats(): Promise<StorageStats>;
cleanOlderThan(date: Date): Promise<number>;
cleanAll(): Promise<number>;
}
export interface RateLimitConfig {
requestsPerPeriod: number;
periodSeconds: number;
}
export interface IRateLimiter {
initialize(): Promise<void>;
acquire(): Promise<void>;
release(): Promise<void>;
}
export interface IContentProcessor {
process(url: string): Promise<ProcessedContent>;
}
export interface ISearchProvider {
search(query: string, options?: SearchOptions): Promise<SearchResult>;
}
export interface BaseCommand {
outputDir: string;
verbose?: boolean;
}
export interface SearchCommand extends BaseCommand {
query: string;
type?: SearchType;
location?: string;
limit?: number;
output?: string;
}
export interface ListCommand extends BaseCommand {
limit?: number;
format?: "table" | "json";
}
export interface ShowCommand extends BaseCommand {
searchId: string;
format?: "table" | "json";
}
export interface CleanCommand extends BaseCommand {
olderThan: string;
dryRun?: boolean;
}
export interface RateLimitLock {
lastRequest: string;
requestCount: number;
}
export interface SearchMetadata {
id: string;
timestamp: string;
query: string;
options: SearchOptions;
resultCount: number;
processingTimeMs: number;
}
export interface ContentMetadata {
url: string;
timestamp: string;
title: string;
formats: {
html: string;
markdown: string;
text: string;
};
processingTimeMs: number;
}
export interface SearchIndex {
searches: {
[id: string]: SearchMetadata;
};
lastCleanup: string;
}