@struktoai/mirage-core
Version:
A Unified Virtual Filesystem For AI Agents
159 lines • 7.7 kB
TypeScript
import type { OpenMode } from '../handles/mode.ts';
import type { VFSStat } from '../types.ts';
/**
* One open file the run's view handed out, answered by the host: the
* guest's twin of the `Descriptor` it holds there, each call made
* synchronously across the bridge.
*/
export interface GuestFile {
readonly mode: OpenMode;
/** The path it was opened at. */
readonly opened: string;
/** Where the links on `opened` led as it opened, which names its inode. */
readonly inode: string;
/** The path its file has now; a rename moves it. */
path(): string;
position(): number;
size(): number;
read(size: number): Uint8Array;
pread(offset: number, size: number): Uint8Array;
write(data: Uint8Array): void;
pwrite(offset: number, data: Uint8Array): void;
seek(offset: number, whence: number): number | null;
truncate(size: number): void;
land(): void;
close(): void;
/** The core's row for it, the size it holds counted. */
fstat(): VFSStat;
/** Whether the name its file had went, so the file has no link left. */
unlinked(): boolean;
}
/** The run's `WasmView`, answered synchronously across the bridge. */
export interface GuestView {
stat(path: string): VFSStat;
lstat(path: string): VFSStat;
statOrNull(path: string, nofollow?: boolean): VFSStat | null;
open(path: string, mode: OpenMode): GuestFile;
unlink(path: string): void;
mkdir(path: string): void;
rmdir(path: string): void;
rename(src: string, dst: string): void;
symlink(path: string, target: string): void;
walked(path: string, follow?: boolean): string;
readlink(path: string): string;
setattr(path: string, atime: string | null, mtime: string | null, nofollow: boolean): void;
readdir(path: string): [string, number][];
}
/** What ends a guest from inside a host call: `proc_exit`, or a stop met
* while the guest waited. The run's caller catches it out of `_start`. */
export declare class GuestExit extends Error {
readonly code: number;
constructor(code: number);
}
/**
* Preview1 host functions over the run's view. One per run: it owns the
* guest fd table (stdin, stdout and stderr plus one preopen at "/"),
* keeps each open file's writes on the host until its close (or the
* guest's exit), and translates the preview1 ABI (iovecs, filestats,
* dirents) for the view. Mirrors Python's `WasiFs`, the args, environment
* and clock calls included, which wasmtime serves natively there.
*
* @param fs - the files the guest sees.
* @param stdin - reads the guest's input as a pipe does; null gives it none.
* @param output - takes each stdout or stderr write as the guest makes it,
* the guest waiting until it is taken; false once its reader has gone.
* @param wait - holds the guest for a poll's delay; true when the run was
* stopped while it waited.
* @param argv - the guest's argv, its program name first.
* @param env - its environment as `NAME=value` entries.
*/
export declare class WasiFs {
private readonly fs;
private readonly output;
private readonly wait;
private readonly argv;
private readonly env;
private readonly offset;
exitCode: number | null;
memory: WebAssembly.Memory | null;
private readonly fds;
constructor(fs: GuestView, stdin: ((size: number) => Uint8Array) | null, output: (fd: 1 | 2, bytes: Uint8Array) => boolean, wait: (ms: number) => boolean, argv: readonly string[], env: readonly string[], offset?: number);
private bytes;
private data;
private load;
private store;
private storeU32;
private storeU64;
private iovs;
private pathArg;
/** The entry under `fd` when it reads: a file's, or stdin. */
private readableEntry;
/** The mount file under `fd` when its open asked to write. */
private writer;
proc_exit(code: number): never;
private strings;
private sizes;
args_get(ptrs: number, buf: number): number;
args_sizes_get(count: number, size: number): number;
environ_get(ptrs: number, buf: number): number;
environ_sizes_get(count: number, size: number): number;
random_get(ptr: number, length: number): number;
sched_yield(): number;
clock_time_get(clock: number, _precision: bigint, result: number): number;
private now;
clock_res_get(clock: number, result: number): number;
poll_oneoff(incoming: number, outgoing: number, count: number, nevents: number): number;
fd_prestat_get(fd: number, buf: number): number;
fd_prestat_dir_name(fd: number, ptr: number, length: number): number;
path_open(dirfd: number, dirflags: number, ptr: number, length: number, oflags: number, rightsBase: bigint, _rightsInherit: bigint, fdflags: number, out: number): number;
private openDir;
fd_close(fd: number): number;
/**
* Send what every file the guest left open still owes the mount. A
* process's writes are in its files whether or not it closed them, so
* the guest's exit flushes each open file the way a close would. One
* that fails does not stop the rest.
*
* @returns one line per file whose writes could not land.
*/
closeAll(): string[];
fd_renumber(fd: number, to: number): number;
private scatter;
fd_read(fd: number, iovs: number, count: number, nread: number): number;
fd_pread(fd: number, iovs: number, count: number, offset: bigint, nread: number): number;
fd_write(fd: number, iovs: number, count: number, nwritten: number): number;
fd_pwrite(fd: number, iovs: number, count: number, offset: bigint, nwritten: number): number;
fd_seek(fd: number, offset: bigint, whence: number, out: number): number;
fd_tell(fd: number, out: number): number;
fd_fdstat_get(fd: number, buf: number): number;
fd_filestat_get(fd: number, buf: number): number;
path_filestat_get(dirfd: number, flags: number, ptr: number, length: number, buf: number): number;
fd_filestat_set_size(fd: number, size: bigint): number;
fd_readdir(fd: number, buf: number, bufLen: number, cookie: bigint, used: number): number;
path_unlink_file(dirfd: number, ptr: number, length: number): number;
path_create_directory(dirfd: number, ptr: number, length: number): number;
path_remove_directory(dirfd: number, ptr: number, length: number): number;
path_rename(dirfd: number, ptr: number, length: number, dstDirfd: number, dstPtr: number, dstLength: number): number;
fd_advise(): number;
fd_datasync(fd: number): number;
fd_sync(fd: number): number;
fd_fdstat_set_flags(): number;
/** Store the stamps a utimensat-shaped call selects. */
private setTimes;
fd_filestat_set_times(fd: number, atim: bigint, mtim: bigint, flags: number): number;
path_filestat_set_times(dirfd: number, flags: number, ptr: number, length: number, atim: bigint, mtim: bigint, fstFlags: number): number;
path_readlink(dirfd: number, ptr: number, length: number, buf: number, bufLen: number, used: number): number;
path_link(): number;
path_symlink(oldPtr: number, oldLength: number, dirfd: number, newPtr: number, newLength: number): number;
}
/**
* The guest's preview1 imports over one run's `WasiFs`, each mapping a
* failure to a guest errno. Filesystem-shaped errors get their own errno;
* anything else, a backend's upstream error on one record most often, is
* EIO: a syscall has no other channel to say it failed. A `GuestExit`
* passes through, so it ends `_start`. Mirrors Python's `install_wasi_fs`.
*
* @param wasi - the run's host-function table.
*/
export declare function wasiImports(wasi: WasiFs): WebAssembly.Imports;
//# sourceMappingURL=fs.d.ts.map