UNPKG

@struktoai/mirage-core

Version:

A Unified Virtual Filesystem For AI Agents

127 lines • 7.67 kB
import type { ByteSource } from '../../io/types.ts'; import { DirListing, FileStat, type PathSpec } from '../../types.ts'; import type { resolveMsGraphConfig } from './config.ts'; export type DriveUrl = (path: string, action?: string) => string; export type DriveRef = (folder?: string) => string; export declare class DriveLoc { readonly drive: string; readonly path: string; readonly virtual: string; private readonly url; private readonly ref; constructor(init: { drive: string; path: string; virtual: string; url: DriveUrl; ref: DriveRef; }); item(action?: string): string; itemAt(path: string, action?: string): string; child(name: string): DriveLoc; parent(): string; reference(folder?: string): string; } export declare function parentPath(path: string): string; export declare function baseName(path: string): string; export declare function directoryPath(path: PathSpec): PathSpec; export declare function virtualKey(path: PathSpec): string; export declare function asNumber(value: unknown): number | null; export declare function folderChildCount(item: Record<string, unknown>): number | null; export declare function copyTree(config: ReturnType<typeof resolveMsGraphConfig>, src: DriveLoc, dst: DriveLoc, srcVirtual?: string, dstVirtual?: string): Promise<void>; /** What a renameReplace moved, and what it replaced. */ export interface MovedItem { moved: Record<string, unknown>; replacedNonFile: boolean; } /** * Move `src` to `dst`, replacing a file or an empty folder there. Answers * the moved driveItem and whether the move replaced something at `dst` * that was not positively a file. */ export declare function renameReplace(config: ReturnType<typeof resolveMsGraphConfig>, src: DriveLoc, dst: DriveLoc, srcVirtual?: string, dstVirtual?: string): Promise<MovedItem>; export interface FolderTarget { item: string; parent: string; virtual: string; } /** * Create one folder, naming a refusal the way mkdir(2) does. * * "replace" is unreliable for folders on real Graph, so the create uses * "fail" and reads its 409: a folder already holding the name is success when * `existOk` (a level `mkdir -p` passes through) and EEXIST otherwise, so a * folder another client made after the lookup ran is still refused; a file * holding it is EEXIST. Graph answers a create under a missing parent and * under a file alike with 404, so the parent is looked up to tell ENOENT from * ENOTDIR. Both lookups run on a refusal only. Mirrors Python's * `create_child_folder`. */ export declare function createChildFolder(config: ReturnType<typeof resolveMsGraphConfig>, parentUrl: string, name: string, target: FolderTarget, existOk?: boolean): Promise<void>; /** * Replace a drive item's content, creating it and its parents, and answer how * many bytes went. A small body is one `PUT`; anything past the simple-upload * limit goes through an upload session. A stream is spooled first, so its size * picks between the two; `signal` stops it. */ export declare function writeItem(config: ReturnType<typeof resolveMsGraphConfig>, loc: DriveLoc, data: ByteSource, signal?: AbortSignal, virtual?: string): Promise<number>; export declare function readItem(config: ReturnType<typeof resolveMsGraphConfig>, loc: DriveLoc, virtual: string, backend: string, offset?: number, size?: number | null): Promise<Uint8Array>; export declare function streamItem(config: ReturnType<typeof resolveMsGraphConfig>, loc: DriveLoc, virtual: string, backend: string): AsyncIterable<Uint8Array>; export declare function iterTree(config: ReturnType<typeof resolveMsGraphConfig>, loc: DriveLoc, virtual?: string): AsyncIterable<[string, Record<string, unknown>, boolean]>; /** * The id of the folder a driveItem sits in, '' when it names none: a listing's * item or a `/delta` feed's. Mirrors Python's `parent_id`. */ export declare function parentId(item: { parentReference?: unknown; }): string; /** * Every item under a folder, each as a listing's stat renders it, from one * read of Graph's `/delta` feed started at that folder. * * One request asks the folder for its id, then the feed lists every item below * it a page at a time, where a walk sends a listing per folder. The feed names * an item by id with its name and its parent's id, never its path, and may * list one more than once (its last row is its state), so each is placed by * its parents up to the folder. An item under one a listing shows as a file (a * package's contents) is left out, as a listing of that file would leave it. * Null when no folder is at `loc`, so the walk's readdir reports what is * there, when Graph refuses the feed, when the feed does not list the folder * the first request found (another folder took its path in between, and the * feed describes that one), when the feed holds a folder shared from another * drive, whose items only that drive's feed lists, and when a file * comes without the `cTag` its listing row carries (OneDrive for Business and * SharePoint leave it out of the feed), since the mount keeps the answer as * the folders' listings. Mirrors Python's `delta_tree`. */ export declare function deltaTree(config: ReturnType<typeof resolveMsGraphConfig>, loc: DriveLoc, virtual?: string): Promise<Map<string, FileStat> | null>; /** * Every item under a folder, each as its folder's listing renders it, from the * folders' listings sent `BATCH_LIMIT` to a request through Graph's JSON * batching, where a walk sends a request per folder. * * The folder's own children are its listing (`readdirItems`), so a folder that * is not there raises what a listing raises. A listing the batch does not * answer with its first page (Graph throttled or failed that one) is asked on * its own, once the longest wait the batch's answers asked for has passed since * it arrived (one wait a batch, each answer's counted from the same moment), * and a listing's later pages are read as a listing reads them. Null when * Graph refuses a batch, or when a * listing below the folder fails (a folder gone, or one the account may not * open), so the walk lists what is there and reports, or skips, each folder on * its own; null too once it holds more than `limit` items, which no listing * is paged past. Mirrors Python's `batch_tree`. */ export declare function batchTree(config: ReturnType<typeof resolveMsGraphConfig>, loc: DriveLoc, path: PathSpec, limit?: number): Promise<Map<string, FileStat> | null>; export declare function driveRootEmpty(config: ReturnType<typeof resolveMsGraphConfig>, loc: DriveLoc, virtual?: string): Promise<boolean>; /** * A folder's children, each as `stat` answers it; past a walk's `limit` Graph * is paged no further, and the listing is partial. Mirrors Python's * `readdir_items`. */ export declare function readdirItems(config: ReturnType<typeof resolveMsGraphConfig>, loc: DriveLoc, path: PathSpec, limit?: number): Promise<FileStat[] | DirListing>; /** One drive item's stat, from Graph. Mirrors Python's `stat_item`. */ export declare function statItem(config: ReturnType<typeof resolveMsGraphConfig>, loc: DriveLoc, path: PathSpec): Promise<FileStat>; export declare function makeExists<A>(stat: (accessor: A, path: PathSpec) => Promise<unknown>): (accessor: A, path: PathSpec) => Promise<boolean>; export declare function makeTruncate<A>(read: (accessor: A, path: PathSpec) => Promise<Uint8Array>, write: (accessor: A, path: PathSpec, data: Uint8Array) => Promise<void>): (accessor: A, path: PathSpec, length: number, noCreate?: boolean) => Promise<void>; //# sourceMappingURL=drive.d.ts.map