@struktoai/mirage-core
Version:
A Unified Virtual Filesystem For AI Agents
149 lines • 8.92 kB
TypeScript
import { IOResult, type ByteSource } from '../../../io/types.ts';
import { FileType, LineFacts, PathSpec, type CopyDeref, type CopyStrategy, type FileStat, type NativeMove, type PrimitiveCopy, type PrimitiveMove, type ReaddirFn, type StatFn } from '../../../types.ts';
import type { FlagView } from '../../spec/flag_view.ts';
import { type BackendKeyFn } from '../utils/copy.ts';
import type { LinkView } from '../../../view/types.ts';
import type { DispatchFn } from '../../../runtime/types.ts';
import type { FsCondition } from '../../../errors/types.ts';
export interface CpFlags {
recursive: boolean;
noClobber: boolean;
interactive: boolean;
verbose: boolean;
update: string | null;
backup: string | null;
suffix: string;
targetDir: PathSpec | null;
noTargetDir: boolean;
dereference: CopyDeref;
}
/**
* Namespace symlink facts and dispatcher primitives for cp and mv.
* Links live above every backend, so no copy strategy lists one and a tree
* copy has to recreate each by name. `relay` and `relayStat` are the dispatcher's
* own transfer primitives, which copy what a followed link leads to on
* whatever mount it lives. Mirrors Python's TransferLinks.
*/
export interface TransferLinks {
links: LinkView;
dispatch: DispatchFn;
cwd: string;
relay: PrimitiveCopy;
relayStat: StatFn;
/** Whether the mount the copy runs on serves a path; absent where every path
* is its own. */
owns?: (virtual: string) => boolean;
}
export declare function cpFlags(init?: Partial<CpFlags>): CpFlags;
export interface TransferPolicy {
cmdName: string;
noClobber: boolean;
update: string | null;
backup: string | null;
suffix: string;
ask?: ((target: PathSpec) => Promise<boolean>) | null;
}
/**
* GNU's -i: ask on stderr before replacing a target and read one line of
* stdin as the answer. Only a line starting with `y` or `Y` is yes (rpmatch
* in the C locale); the end of input is no. A yes is recorded in `accepted`,
* since it is no failure. Mirrors Python's prompter.
*/
export declare function prompter(cmdName: string, stdin: ByteSource | null, errors: string[], accepted: string[]): (target: PathSpec) => Promise<boolean>;
export declare function stderrOf(errors: readonly string[]): Uint8Array | null;
export declare function updateGates(mode: string | null): boolean;
export declare function backupDisplaces(control: string | null): boolean;
export declare function updateMode(cmdName: string, fl: FlagView): string | null;
export declare function suffixFlag(fl: FlagView): string | null;
export declare function backupRaw(fl: FlagView): string | boolean | undefined;
export declare function targetFlags(cmdName: string, fl: FlagView): [PathSpec | null, boolean];
export declare function parseFlags(fl: FlagView): CpFlags;
/** Stat the entry itself for overwrite and backup decisions. */
export declare function linkStat(copies: TransferLinks, path: PathSpec): Promise<FileStat>;
export declare function renameLink(copies: TransferLinks, src: PathSpec, target: PathSpec): Promise<void>;
/**
* stat(2) of a destination, over a table whose stat is lstat(2). cp opens its
* destination the way open(2) does, through a link at the name: a link to a
* directory is that directory, one to a file is the file it writes through, and
* one that leads nowhere is no destination at all (cp then refuses to write
* through it). Mirrors Python's dest_stat.
*/
export declare function destStat(stat: StatFn, copies: TransferLinks | undefined): StatFn;
/**
* The destination as the link standing at its name, null where none does. The
* router follows a destination to what its link leads to, which is what a plain
* copy writes, through the link. GNU's backup renames the destination itself, a
* link included, and the copy then lands at the name, so a backup is made of
* this and the copy goes here: through the mount's own copy, which keeps the
* source's mode, or through the dispatcher where the name sits on another mount
* (`owns`). Mirrors Python's link_name.
*/
export declare function linkName(copies: TransferLinks, target: PathSpec): PathSpec | null;
/** Copy a symlink through the shared overwrite and backup policy. */
export declare function makeLink(copies: TransferLinks, src: PathSpec, target: PathSpec, text: string, policy: TransferPolicy, errors: string[], lines: string[] | undefined): Promise<boolean>;
/**
* Recreate the links below a copied directory, which its copy could not see.
* Without -L each lands as a link with its target verbatim, dangling and
* looping ones included. Under -L each is what it leads to: a file's bytes, a
* directory's whole tree (the links below it included), and `cannot stat` for
* one that leads nowhere or loops (coreutils 9.7). A link that leads back into
* a tree being copied is refused as GNU names it, `cannot copy cyclic symbolic
* link`, rather than copied until the name is too long, which is where GNU
* stops. Mirrors Python's copy_tree_links.
*/
export declare function copyTreeLinks(copies: TransferLinks, deref: CopyDeref, src: PathSpec, target: PathSpec, errors: string[], lines: string[] | undefined, policy: TransferPolicy, seen?: readonly string[], blocked?: readonly string[]): Promise<void>;
export declare function splitOperands(cmdName: string, paths: PathSpec[], targetDir: PathSpec | null, noTargetDir: boolean): [PathSpec[], PathSpec];
export declare function targetDirError(cmdName: string, stat: StatFn, target: PathSpec): Promise<string | null>;
export declare function destKind(stat: StatFn, target: PathSpec): Promise<{
exists: boolean;
isDir: boolean;
condition: FsCondition | null;
}>;
export declare function slashRefusesFile(target: PathSpec, targetExists: boolean, srcIsDir: boolean): boolean;
export declare function sourceKind(stat: StatFn, path: PathSpec): Promise<{
kind: FileType | null;
condition: FsCondition | null;
}>;
export declare function overwriteTypeError(cmdName: string, src: PathSpec, srcIsDir: boolean, target: PathSpec, targetExists: boolean, targetIsDir: boolean): string | null;
export declare function typeMismatchError(cmdName: string, src: PathSpec, target: PathSpec, srcIsDir: boolean): string;
export declare function sameFileError(cmdName: string, src: PathSpec, target: PathSpec): string;
export declare function justCreatedError(cmdName: string, src: PathSpec, target: PathSpec): string;
export declare function overwriteGate(policy: TransferPolicy, stat: StatFn, src: PathSpec, target: PathSpec, errors: string[], copies?: TransferLinks): Promise<boolean>;
export declare function makeBackup(policy: TransferPolicy, strategy: CopyStrategy | PrimitiveMove | NativeMove, stat: StatFn, readdir: ReaddirFn | undefined, target: PathSpec, errors: string[], copies?: TransferLinks): Promise<{
backup: PathSpec | null;
ok: boolean;
}>;
export declare function within(path: string, root: string): boolean;
export declare function walk(readdir: ReaddirFn, stat: StatFn, root: PathSpec, cmdName?: string, errors?: string[], links?: LinkView): Promise<{
path: string;
kind: FileType;
}[]>;
export declare function copyEntries(cmdName: string, strategy: PrimitiveCopy | PrimitiveMove, stat: StatFn, src: PathSpec, target: PathSpec, entries: {
path: string;
kind: FileType;
}[], errors: string[], opts?: {
policy?: TransferPolicy;
lines?: string[] | undefined;
copies?: TransferLinks | undefined;
rootBackup?: PathSpec | null;
blocked?: string[];
}): Promise<boolean>;
/**
* Copy one file between the strategy's mounts, reporting a failure in GNU's
* words; false when it failed. A store-to-store copy goes first where the
* strategy has one: the destination's store copies from the source's without
* the bytes passing through mirage. EXDEV from it says the stores cannot, as
* ENOTSUP does from a store with no copy of its own, and a declined walk says
* a hide or rule wants the copy made by parts; either way
* the bytes move through a read and a write, the file materialized in
* between. Mirrors Python's transfer_file.
*/
export declare function transferFile(strategy: PrimitiveCopy | PrimitiveMove, src: PathSpec, dst: PathSpec, cmdName: string, errors: string[]): Promise<boolean>;
export declare function cpGeneric(paths: PathSpec[], stat: StatFn, strategy: CopyStrategy, flags: CpFlags, backendKey?: BackendKeyFn, readdir?: ReaddirFn, linkAt?: (path: PathSpec) => FileStat | null, copies?: TransferLinks, stdin?: ByteSource | null, dispatch?: DispatchFn): Promise<[ByteSource | null, IOResult]>;
/**
* A cp line reads below its sources when it copies recursively (`-r`, `-R`,
* `-a`), and copies into the directory `-t` names if it names one. Mirrors
* Python's `facts`.
*/
export declare function facts(fl: FlagView, _operands: readonly (string | PathSpec)[]): LineFacts;
//# sourceMappingURL=cp.d.ts.map