import type { ReportDocument, ReportIndexCard } from '../types/index.js'; import type { DoctorSkillStatus } from '../types/doctor.js'; export type ArtifactDomain = 'report' | 'doctor' | 'observe-health'; /** 某域的索引目录 `//`。 */ export declare function artifactIndexDir(domain: ArtifactDomain): string; /** report 域口径(保持向后兼容的既有导出)。 */ export declare function shouldIndexReport(outputDir: string): boolean; /** * 某域所有卡片「真身(card.path)」的存在性 + mtime/size 指纹。 * 消费方(indexed-report-store / buildSkillIndex)的缓存指纹必须纳入它:卡片 JSON 本身没变、只靠卡片目录 * mtime 的指纹检测不到「真身被带外删」,长会话会继续命中旧缓存展示悬空卡片。真身删/改 → 此 sentinel 变 → * 缓存失效 → live 过滤生效。读卡片只为拿 path,字段宽松。 */ export declare function cardTargetSentinel(domain: ArtifactDomain): string; /** * persistReport 的索引钩子:报告落盘后 best-effort 追加卡片。永不抛、永不阻断报告落盘。 * 入参故意收 `{id}` 宽松(同 persistReport 的 PersistableReport):非完整报告(无 canonical kind)防御式跳过。 */ export declare function indexReportWrite(report: ReportDocument, sourcePath: string, outputDir: string): void; /** 读 report 域全部卡片(跳过坏文件 / 缺字段 / 坏 kind)。 */ export declare function listReportCards(): ReportIndexCard[]; /** report 卡片(过滤悬空真身):供 studio 机器级 list / findBy 展示。 */ export declare function listLiveReportCards(): ReportIndexCard[]; /** 删 report 域某 id 的卡片(DELETE 报告时连卡片一起删,使其从机器级 list 消失)。幂等、best-effort。 */ export declare function removeReportCard(id: string): boolean; /** doctor 卡片:per-skill 文件(`{skillName}-{reportId}.json`)一张。id = 文件名 stem(唯一), * reportId = 该次 doctor run 的 id(同 run 多 skill 共享)。剥掉逐规则 results 重体,只留 per-skill 计数。 * 无 `kind` 字段 —— domain 已足够判别(doctor 只有一种报告 kind)。 */ export interface DoctorIndexCard { domain: 'doctor'; id: string; path: string; skillName: string; reportId: string; timestamp: string; status: DoctorSkillStatus; passCount: number; warnCount: number; failCount: number; } /** persistDoctorReport per-skill 循环里的索引钩子。best-effort,永不抛、永不阻断正文落盘。 */ export declare function indexDoctorWrite(card: Omit, outputDir: string): void; /** 读 doctor 域全部卡片。 */ export declare function listDoctorCards(): DoctorIndexCard[]; /** doctor 卡片(过滤悬空真身):供 buildSkillIndex 机器级合并。 */ export declare function listLiveDoctorCards(): DoctorIndexCard[]; /** 删 doctor 域某 id(文件 stem)的卡片。doctor 历史按 50/skill prune,删正文时必须连卡片一起删, * 否则被 prune 掉的报告会经卡片合并在本项目 studio「复活」。 */ export declare function removeDoctorCard(id: string): boolean; /** observe 报告投影到卡片所需的结构子集(不 import observability/SkillHealthReport,保持 eval-core 解耦)。 */ interface ObserveCardSkill { toolFailureRate: number; toolFailureCount?: number; toolCallCount?: number; toolResolvedCount?: number; toolCancelledCount?: number; toolUnknownCount?: number; segmentCount: number; gap?: { weightedGapRate?: number; }; confidence?: 'high' | 'low' | 'underpowered'; stability?: 'stable' | 'unstable' | 'very-unstable' | 'unknown'; } interface ObserveSource { meta: { generatedAt: string; sessionCount: number; segmentCount: number; }; overall: { healthBand: 'green' | 'yellow' | 'red'; confidence?: 'high' | 'low' | 'underpowered'; }; bySkill: Record; } /** observe 卡片:每份报告一张。id = 文件名 stem。剥掉每个 skill 的 gap.signals 等重体,只留 list / skill-index * 口径需要的标量(meta 摘要 + overall + per-skill 标量)。详情(含 signals)走 card.path 读真身。无 `kind` 字段。 */ export interface ObserveIndexCard { domain: 'observe-health'; id: string; path: string; meta: { generatedAt: string; sessionCount: number; segmentCount: number; }; overall: { healthBand: 'green' | 'yellow' | 'red'; confidence?: 'high' | 'low' | 'underpowered'; }; bySkill: Record; } /** persistObserveHealthReport 的索引钩子。best-effort,永不抛、永不阻断正文落盘。 */ export declare function indexObserveWrite(report: ObserveSource, sourcePath: string, outputDir: string, id: string): void; /** 读 observe-health 域全部卡片。 */ export declare function listObserveCards(): ObserveIndexCard[]; /** observe 卡片(过滤悬空真身):供 listAnalyses / buildSkillIndex 机器级合并。 */ export declare function listLiveObserveCards(): ObserveIndexCard[]; /** 删 observe 域某 id 的卡片。 */ export declare function removeObserveCard(id: string): boolean; export {};