export interface ConfigPathCandidate { path: string; source: string; clientKey: string; } export interface ClaudeDesktopConfigCandidate { file: string; source: string; exists: boolean; } /** Filesystem identity used by every desktop scan/protection surface. */ export declare function normalizedPath(value: string): string; /** True for the excluded root itself and every descendant (segment-safe). */ export declare function pathIsWithin(candidate: string, root: string): boolean; export declare function isExcludedPath(candidate: string, excludedRoots?: string[]): boolean; export declare function uniqueNormalizedPaths(values: string[]): string[]; /** * Keep only the shallowest non-overlapping scan roots. If C:\dev is present, * C:\dev\repo is redundant: the bounded parent walk already covers it. */ export declare function compactScanRoots(values: string[]): string[]; export declare function claudeDesktopMsixCandidates(): ClaudeDesktopConfigCandidate[]; export declare function claudeDesktopConfigCandidates(): ClaudeDesktopConfigCandidate[]; /** * Windows folders whose presence means Claude Desktop is installed even when * no `claude_desktop_config.json` exists yet (fresh install, no MCP servers). * The standard (Squirrel) installer targets %LOCALAPPDATA%\AnthropicClaude — * NOT Program Files — which is why installed-but-unconfigured Claude Desktops * were invisible to discovery before this list existed. Pure — unit-tested. */ export declare function claudeDesktopWindowsInstallDirs(env?: NodeJS.ProcessEnv, home?: string): string[]; export declare function claudeDesktopLikelyInstalled(): boolean; export declare function claudeDesktopInstallTargets(configPath?: string): ClaudeDesktopConfigCandidate[]; /** All MCP client config locations discover / install should check. */ export declare function candidateConfigPaths(cwd: string, extra?: string): ConfigPathCandidate[]; /** Common places developers keep code, used by `--scan-root auto`. */ export declare function defaultScanRoots(): string[]; /** * Bounded walk of developer folders looking for project-scoped MCP configs * (`--scan-root`). Depth- and volume-capped so it stays fast and predictable — * this is a repo-root sweep, not a disk scan. Hidden/dependency/build folders * are pruned; only the known project config filenames are checked. */ export declare function scanRootsForProjectConfigs(roots: string[], options?: { maxDepth?: number; maxDirs?: number; excludedRoots?: string[]; }): { candidates: ConfigPathCandidate[]; scannedDirs: number; excludedDirs: number; truncated: boolean; maxDepth: number; maxDirs: number; }; export interface FolderCatalogEntry { path: string; /** Depth relative to its walk root (home or a dev root) — lets the UI indent. */ depth: number; /** True when the folder has at least one visible subfolder (UI shows an expander). */ hasChildren: boolean; } /** * Shallow, bounded folder tree of the machine for the console folder picker: * the user home plus every default dev root, walked a few levels deep, names * only. The admin expands this tree in the dashboard and picks folders to add * to the posture scan — so the picker always reflects the machine's REAL * structure without uploading anything sensitive (no files, no contents). */ export declare function buildFolderCatalog(options?: { maxDepth?: number; maxEntries?: number; extraRoots?: string[]; }): FolderCatalogEntry[]; /** Resolve the --scan-root flag: comma-separated paths, or "auto" for common dev folders. */ export declare function resolveScanRoots(flag: string | undefined): string[]; /** Include config paths for apps that exist on disk even when the MCP file is not created yet. */ export declare function discoverScanTargets(cwd: string, extra?: string): ConfigPathCandidate[]; /** * True when the AI *app* is on disk — not when a leftover config folder exists. * `~/.codex` / `~/.cursor` without Cursor.exe must not count as installed. */ export declare function detectIdeAppInstalled(clientKey: string, env?: NodeJS.ProcessEnv, home?: string, platform?: NodeJS.Platform): boolean;