import type { Logger } from "./log.js"; import type { RunFileCandidate } from "./types.js"; export interface ScanLimits { maxFiles?: number; maxFileBytes?: number; maxPreviewChars?: number; maxDepth?: number; maxReportMs?: number; } export declare const FILE_REPORT_BATCH_MAX_FILES = 50; export declare const FILE_REPORT_BATCH_MAX_BYTES: number; export interface ScannedFile extends RunFileCandidate { absPath: string; } export interface FileReportingClient { postFiles(agentRunId: string, files: RunFileCandidate[], truncated?: boolean, signal?: AbortSignal): Promise; recordWorkspaceScanMeasurement?(agentRunId: string, measurement: WorkspaceScanMeasurement): Promise | void; } export interface WorkspaceScanMeasurement { fileCount: number; totalBytes: number; durationMs: number; truncated: boolean; } export interface FileReportResult { reported: number; failed: number; truncated: boolean; scan: WorkspaceScanMeasurement; } interface WorkspaceFileFingerprint { sizeBytes: number; sha256: string; } /** * 普通 Agent turn 启动前捕获的 workspace 文件基线。 * * 基线只用于判断本轮新增/修改,不会上报给 Course Service,也不把迁移复制进来的 * 既有文件变成本轮 TaskRun 证据。truncated=true 时,缺席于 files 的路径不能安全地 * 判定为“本轮新增”,所以上报阶段会对这类路径 fail closed。 */ export interface WorkspaceFileBaseline { files: ReadonlyMap; truncated: boolean; } /** * 递归扫描 workspace 产出文件候选。 * 跳过:符号链接、隐藏项(`.` 开头)、node_modules、超深、超大、相对路径不安全的项。 * 达到 maxFiles 上限后停止并标记 truncated。 */ export declare function scanWorkspaceFiles(workspaceDir: string, limits?: ScanLimits): Promise<{ files: ScannedFile[]; truncated: boolean; measurement: WorkspaceScanMeasurement; }>; /** 捕获普通 Agent turn 开始前的 workspace 基线。 */ export declare function captureWorkspaceFileBaseline(workspaceDir: string, limits?: ScanLimits): Promise; export declare function fileReportBatches(files: RunFileCandidate[]): RunFileCandidate[][]; /** * 扫描并一次性上报文件候选。整批失败只 warn 不中断;返回上报结果。 */ export declare function reportFileCandidates(client: FileReportingClient, agentRunId: string, workspaceDir: string, log: Logger, limits?: ScanLimits, baseline?: WorkspaceFileBaseline): Promise; export {};