import type { WindowsJobMemoryProbeResult } from "@gajae-code/natives"; import type { Settings } from "../config/settings"; import { type TabGcSnapshot } from "./browser/tab-supervisor"; export interface BrowserGcPolicy { enabled: boolean; idleMs: number; rssLimitBytes: number; } export interface ComputerGcPolicy { enabled: boolean; staleMs: number; scanIntervalMs: number; } export declare function resolveBrowserGcPolicy(settings: Settings): BrowserGcPolicy; export declare function resolveComputerGcPolicy(settings: Settings): ComputerGcPolicy; export declare function resolveSweepIntervalMs(settings: Settings): number; /** Injectable seams so the controller is fully testable without real browsers/filesystem/RSS. */ export interface ResourceGcDeps { now: () => number; monotonicNow: () => number; rssBytes: () => number; memorySnapshot: () => Promise; runGc: () => void; logWarn: (msg: string, meta?: Record) => void; listTabs: () => TabGcSnapshot[]; releaseTab: (name: string, policy: { now: () => number; idleMs: number; }) => Promise; cleanupScreenshots: (opts: { now: () => number; staleMs: number; }) => Promise<{ scanned: number; removed: number; }>; screenshotArmed: () => boolean; } /** Request collection without synchronously stopping the main event loop. */ export declare function requestMemoryPressureGc(): void; export interface ResourceGcRegistration { sessionId: string; settings: Settings; cwd?: string | (() => string); } /** * Register a session with the resource GC. Starts the single shared timer on the first * registration. Returns an idempotent unregister function; the timer stops only when the last * session unregisters. */ export declare function registerResourceGcSession(reg: ResourceGcRegistration): () => void; export declare function sweepOnce(d?: ResourceGcDeps): Promise; export interface MemoryPressureDomain { hardCapBytes: number; totalUsageBytes: number; source: MemoryPressureSnapshot["source"]; } export interface MemoryPressureSnapshot { hardCapBytes: number; totalUsageBytes: number; parentBytes: number; source: "host" | "linux_cgroup_v2" | "linux_cgroup_v1" | "windows_job" | "windows_process_job_limit"; domains?: MemoryPressureDomain[]; } export declare function __sampleLinuxCgroupHierarchyForTest(mountInfo: string, membership: string, fsType: "cgroup" | "cgroup2", hostBytes: number, parentBytes: number): Promise; export declare function __sampleWindowsJobMemoryForTest(hostBytes: number, parentBytes: number, probeResult?: WindowsJobMemoryProbeResult): MemoryPressureSnapshot | null; export declare function __selectMemoryPressureDomainForTest(snapshot: MemoryPressureSnapshot, policyLimitBytes: number | null): MemoryPressureSnapshot; export declare function __setResourceGcDepsForTest(overrides: Partial): void; export declare function __setResourceGcSchedulerNowForTest(now: () => number): void; export declare function __runResourceGcTickForTest(): Promise; export declare function __runResourceGcTimerCallbackForTest(owner: { generation: number; token: number; }, deadline: number): Promise; export declare function __getResourceGcStateForTest(): { timerActive: boolean; sessionCount: number; rssWarningActive: boolean; inProgress: boolean; generation: number; pendingDeadline: number | null; pendingOwner: { generation: number; token: number; } | null; deferredDeadline: number | null; deferredGeneration: number | null; activeGeneration: number | null; }; export declare function __resetResourceGcForTest(): void;