52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
|
|
export type SearchType = "threads_keyword" | "web_search" | "crawler";
|
|||
|
|
|
|||
|
|
export type KeywordPriority = "high" | "medium" | "low";
|
|||
|
|
|
|||
|
|
export type SearchProviderName = "threads" | "brave" | "crawler";
|
|||
|
|
|
|||
|
|
export interface SearchRequest {
|
|||
|
|
keyword: string;
|
|||
|
|
limit: number;
|
|||
|
|
since?: Date;
|
|||
|
|
source: SearchProviderName;
|
|||
|
|
searchType: SearchType;
|
|||
|
|
priority?: KeywordPriority;
|
|||
|
|
/** 直接指定 Brave 查詢(略過 keyword query builder) */
|
|||
|
|
query?: string;
|
|||
|
|
/** 巡邏模式:檢查 high priority + 每日額度(預設 true) */
|
|||
|
|
patrolMode?: boolean;
|
|||
|
|
/** 僅保留 threads.com 結果(預設 true) */
|
|||
|
|
threadsOnly?: boolean;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export interface SearchResult {
|
|||
|
|
title: string;
|
|||
|
|
url: string;
|
|||
|
|
snippet: string;
|
|||
|
|
author: string;
|
|||
|
|
publishedAt?: Date;
|
|||
|
|
source: SearchProviderName;
|
|||
|
|
threadId?: string;
|
|||
|
|
raw?: Record<string, unknown>;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export interface SearchResponse {
|
|||
|
|
provider: SearchProviderName;
|
|||
|
|
results: SearchResult[];
|
|||
|
|
status: "success" | "unavailable" | "skipped";
|
|||
|
|
skipReason?: string;
|
|||
|
|
quotaUsed?: number;
|
|||
|
|
quotaLimit?: number;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export interface KeywordInput {
|
|||
|
|
value: string;
|
|||
|
|
limit: number;
|
|||
|
|
priority: KeywordPriority;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export interface SearchProvider {
|
|||
|
|
name(): SearchProviderName;
|
|||
|
|
enabled(): boolean;
|
|||
|
|
search(req: SearchRequest): Promise<SearchResponse>;
|
|||
|
|
}
|