@struktoai/mirage-core
Version:
A Unified Virtual Filesystem For AI Agents
126 lines • 6.73 kB
TypeScript
import { FlagView } from '../../spec/flag_view.ts';
import { LineFacts, PathSpec } from '../../../types.ts';
import type { Context } from '../../config.ts';
import { IOResult, type PathRecord } from '../../../io/types.ts';
import type { MountView } from '../../../view/types.ts';
export type ComputeSize = (p: PathSpec) => Promise<number>;
export type DuEntries = [entries: [string, number][], total: number];
export type ComputeEntries = (p: PathSpec) => Promise<DuEntries>;
/** The parsed `du` command line. */
export interface DuFlags {
/** -s, one total per operand and no subtree lines. */
s: boolean;
/** -a, list files as well as directories. */
a: boolean;
/** -h, human-readable sizes. */
h: boolean;
/** -c, append a grand total. */
c: boolean;
/** -S/--separate-dirs, directories exclude subdirectory sizes. */
S: boolean;
/** --max-depth/-d, deepest level to print. */
maxDepth: number | null;
/** A non-fatal diagnostic GNU prints before the output. */
warning?: string;
}
/** What `du` produced for one invocation. */
export interface DuOutput {
stdout: Uint8Array;
/** Diagnostics: unreadable operands, then the truncation notice. */
stderr: Uint8Array;
/**
* 0, or 1 when an operand could not be read or a walk was cut short, as GNU
* does for a tree it could not fully account for.
*/
exitCode: number;
/**
* Each readable operand's measurement; null when one was only summed (`-s`,
* or a backend that can only produce a size).
*/
records: PathRecord[] | null;
}
/**
* du's options, `--max-depth` and its conflicts with `-s` and `-a` read by
* mirage-rs before any operand is resolved: the flags, or du's refusal.
* Mirrors Python's `parse_flags`.
*/
export declare function parseFlags(ctx: Context): DuFlags | IOResult;
/**
* Lift mount-relative walk entries onto absolute virtual paths.
*
* Backends walk their own key space and report mount-relative paths, so two
* mounts that both hold `notes.txt` would otherwise render the same line. The
* mount prefix is recovered from the operand the same way `find` and `grep -r`
* recover it.
*/
export declare function toVirtual(entries: [string, number][], path: PathSpec): [string, number][];
/**
* Sum of leaves whose parent is the operand (GNU `-S` total).
*/
export declare function separateTotal(entries: [string, number][], root: string): number;
/**
* Derive GNU's per-directory lines from a flat list of leaf files.
*
* Backends report only files, but GNU `du` prints a line per directory
* carrying its recursive total (and, under `-a`, a line per file too). Every
* directory between the operand and a leaf therefore accumulates that leaf's
* size, and the result is emitted post-order: children before their parent,
* siblings sorted by name. GNU walks in readdir order, which is unspecified,
* so sorting is a deterministic choice within the same shape.
*
* With `-S`/`--separate-dirs` a directory only counts files that sit
* directly in it: a leaf still forces every ancestor directory to appear
* (possibly at size 0), but only the immediate parent gets its bytes.
* The operand's own line is not included; the caller renders it with the
* operand as typed.
*/
export declare function rollup(entries: [string, number][], root: string, ctx: {
all: boolean;
maxDepth: number | null;
dirs?: readonly string[];
separateDirs?: boolean;
}): [string, number][];
/** Each file a measurement counted, as (virtual path, bytes). */
export declare function leavesOf(records: readonly PathRecord[]): [string, number][];
/**
* Render `du` output for a list of operands.
*
* `computeEntries` reports mount-relative (path, size) pairs plus the total.
* `missing` names the operands that could not be read: GNU reports each and
* exits 1 but still prints the rest. `stopped` is read after the walks for
* where one ran past `walkLimit`, each line without the command's name.
* `mounts` marks the descendant
* boundaries: leaves under one are shadowed and dropped from every row and
* total (see `dropShadowed`). `unreadable` is read after the walks for the
* directories a walk could not open (a rule refused them below the operand):
* GNU names each one, counts what it could, and exits 1; the line is spelled
* as the operand was typed, and follows the unreadable-operand lines since
* those are known before any walk. `directories` is read after each operand's
* walk for every directory it met, so one no file points at (empty, or
* refused) still gets GNU's row. `inaccessible` is read after the walks for
* each link `-L` could not follow, with the strerror GNU adds for a chain
* that loops (it names a dangling one alone); exits 1.
*/
export declare function du(paths: PathSpec[], flags: DuFlags, computeSize: ComputeSize, computeEntries: ComputeEntries, missing?: [string, string][], stopped?: () => readonly string[], mounts?: MountView | null, unreadable?: () => readonly string[], directories?: () => readonly string[], inaccessible?: () => readonly (readonly [string, string | null])[], repeated?: (p: PathSpec) => boolean): Promise<DuOutput>;
/**
* Run one whole `du` invocation, from raw flags to rendered bytes.
*
* Every caller needs the same three steps in the same order: validate the
* flags before touching I/O, split the operands into readable and unreadable,
* then render. Keeping them here means a backend wrapper is wiring only, and
* the three steps cannot drift apart per backend.
*
* The walks meet links as entries of their own; under -L they follow them
* instead, which the operand's own was already, at dispatch. Deliberate
* divergence: a link counts as its target string's length, the size `ls -l`
* prints, where GNU counts the disk blocks it holds (0 for a target short
* enough to live in the inode); mirage counts bytes throughout.
*/
export declare function duGeneric(paths: PathSpec[], ctx: Context, resolveGlob: (targets: PathSpec[]) => Promise<PathSpec[]>, stat: (p: PathSpec) => Promise<unknown>, computeSize: ComputeSize, computeEntries: ComputeEntries, stopped?: () => readonly string[], unreadable?: () => readonly string[], directories?: () => readonly string[], inaccessible?: () => readonly (readonly [string, string | null])[], repeated?: (p: PathSpec) => boolean): Promise<[Uint8Array, IOResult]>;
/**
* A du line reads below every path it names, walks into the mounts below
* unless `-x`, and follows a link operand when the last of `-L` and `-P` is
* `-L`. Mirrors Python's `facts`.
*/
export declare function facts(fl: FlagView, _operands: readonly (string | PathSpec)[]): LineFacts;
//# sourceMappingURL=du.d.ts.map