feat(sites): 站点请求失败留样(site_failure_sample,每站最近 5 份)

- 迁移 0077 新表 site_failure_sample:类型(parse_error / challenge)、请求类型、脱敏 URL、状态码、
  关键响应头、错误文案、命中规则、脱敏页面开头(≤ 64 KB);样本几十 KB,不放进每条请求都读的 site.config
- 适配器 onFailureSample 回调接到 runtime.siteAdapter,异步写入并删到最近 5 份,写失败只记日志
- GET /sites/{id}/failure-samples(不带正文)与 /failure-samples/{sampleId}(带正文)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-10-06 15:41:00 +08:00
1 parent 1779e1a0f2
commit 0088c1c9e7
10 files changed
+355

No files matched your search

+20
View File
@@ -255,6 +255,7 @@ export type SiteCircuitState = "closed" | "open" | "half_open";
export type SiteKind = "pt" | "public_bt" | "rss_feed" | "torznab" | "subtitle";
export type SiteAccountAuthKind = "cookie" | "passkey" | "api_key" | "password";
export type SiteAccountStatus = "unknown" | "active" | "invalid" | "expired" | "challenge";
export type SiteFailureSampleKind = "parse_error" | "challenge";
export type SiteSnapshotKind = "periodic" | "backfill" | "live_search" | "manual";
export type SiteSnapshotStatus = "running" | "ok" | "partial" | "failed";
export type SourceReleaseResolutionStatus = "unresolved" | "resolved" | "ambiguous" | "unidentifiable" | "rejected";
@@ -1491,6 +1492,21 @@ export interface SiteAccountTable {
ua_pending: string | null;
}
export interface SiteFailureSampleTable {
id: Generated<string>;
site_id: string;
kind: SiteFailureSampleKind;
request_kind: string;
url: string;
http_status: number | null;
headers: Generated<Json>;
message: string;
rule: string | null;
body: string;
truncated: Generated<boolean>;
created_at: GeneratedTimestamptz;
}
export interface SiteRequestCountTable {
site_id: string;
hour: Timestamptz;
@@ -1825,6 +1841,7 @@ export interface DB {
settings: SettingsTable;
site: SiteTable;
site_account: SiteAccountTable;
site_failure_sample: SiteFailureSampleTable;
site_request_count: SiteRequestCountTable;
site_snapshot: SiteSnapshotTable;
site_user_data: SiteUserDataTable;
@@ -2051,6 +2068,9 @@ export type SiteUpdate = Updateable<SiteTable>;
export type SiteAccountRow = Selectable<SiteAccountTable>;
export type NewSiteAccount = Insertable<SiteAccountTable>;
export type SiteAccountUpdate = Updateable<SiteAccountTable>;
export type SiteFailureSampleRow = Selectable<SiteFailureSampleTable>;
export type NewSiteFailureSample = Insertable<SiteFailureSampleTable>;
export type SiteFailureSampleUpdate = Updateable<SiteFailureSampleTable>;
export type SiteRequestCountRow = Selectable<SiteRequestCountTable>;
export type NewSiteRequestCount = Insertable<SiteRequestCountTable>;
export type SiteRequestCountUpdate = Updateable<SiteRequestCountTable>;