@struktoai/mirage-core
Version:
A Unified Virtual Filesystem For AI Agents
93 lines • 5.35 kB
TypeScript
import type { ExecAction } from '../../commands/builtin/types.ts';
import type { Identity } from '../../commands/builtin/utils/identity.ts';
import { type ByteSource, type PathRecord } from '../../io/types.ts';
import type { FindExpr } from '../../rs/find.ts';
import type { DispatchFn } from '../../runtime/types.ts';
import { type PathSpec } from '../../types.ts';
import type { StatPath } from '../../view/types.ts';
import type { ExecuteFn } from '../expand/types.ts';
import type { Files } from '../files.ts';
import type { MountRegistry } from '../mount/registry.ts';
import type { SessionState } from '../session/session.ts';
/**
* The shell line one `-exec` run becomes. GNU execs the words directly, so
* every match must reach the command as exactly one argv word: the line is
* built with `shellJoin`, and a plain join would be re-parsed by the shell.
* A per-match run substitutes every `{}` inside every word (`x{}y` is
* `xd/a.txty`); a batched run replaces its one bare `{}` with the matches,
* one word each.
*/
/**
* The argv one `-exec` run becomes, matches substituted: a per-match run
* substitutes every `{}` inside every word (`x{}y` is `xd/a.txty`), a
* batched run replaces its one bare `{}` with the matches, one word
* each. The head is substituted like any other word, which is what lets
* `-exec {} \;` run each match itself.
*/
export declare function execWords(action: ExecAction, paths: readonly string[]): string[];
/**
* Whether `execvp` would fail to find a head word (`find -exec`, `exec`),
* and whether a shell function shadows the program it would find. A head
* carrying a slash is a file the loader runs, which no builtin, function or
* CLI can claim, so it is statted where the line would read it; any other
* head is looked up by name across the layers dispatch consults, in
* `session`'s shell. Outside a workspace there is no stat and the loader
* answers for itself.
*/
export declare function programHead(head: string, session: SessionState | null, registry: MountRegistry, cwd: string, statPath: StatPath | null): Promise<[boolean, boolean]>;
/**
* GNU's `-depth` order over sorted siblings: a directory's contents, each
* sorted, then the directory. The final component is flagged so a path
* sorts after its descendants, whose entry at that depth carries the same
* name unflagged. A start point spelled with a trailing slash prints as
* `d/` while its descendants print as `d/a`, so the slash is dropped
* before splitting: kept, it would leave an empty final component that
* sorts the directory ahead of everything under it, which is the one
* order `-delete` cannot remove a tree in.
*/
export declare function compareDepthFirst(a: string, b: string): number;
/**
* Apply find's actions (-exec / -delete / -print0 / -ls / -printf) to its
* rows.
*
* Per-VFS find handlers only emit matched paths. This dispatcher
* layer re-reads the actions off the expression and applies them per
* match, in the order they were written, the way GNU's implicit `-a`
* chain runs: each per-match `-exec` runs in turn and the first that
* fails ends the chain for that match, so a later `-print` (or `-ls`,
* `-print0`, `-printf`, `-delete`) sees only the matches every earlier
* `-exec` accepted (`-exec grep -q x {} ";" -print`), and `-exec echo {}
* ";" -print -exec echo again {} ";"` alternates the three per match. A
* batched `-exec ... {} +` collects the match at its position and runs
* once after the walk; a failing batch is find's exit 1, as is a row it
* could not delete, list or stat for a `-printf`, and either ends that
* row's chain; a failing per-match run is not, and neither is a command
* that cannot be found, which GNU reports per match and carries on from
* with exit 0. An action other than `-print` suppresses
* the implicit print. `-delete` runs at its position, so a later `-exec`
* sees the row gone, and a row it cannot delete ends the chain with GNU's
* line and find's exit 1. It also turns on `-depth`, which orders every
* directory after its contents, the only order a tree can be removed in;
* `-depth` alone reorders the implicit print the same way, and both
* order one start point's walk at a time: GNU walks each start point to
* completion before the next, so `find b a -depth` prints `b/x b a/y a`
* and `find d d/sub -depth` finishes `d` before it begins `d/sub` again,
* which is why each row names the start point it was found under;
* `-printf`'s %P and %d measure a row from that start point. Returns the rows to print, the stderr to append, and the
* exit status the actions impose (0 when they impose none, even with
* stderr).
*/
export declare function applyFindActions(stdout: ByteSource | null, records: readonly PathRecord[] | null, expr: FindExpr, registry: MountRegistry, cwd: string, options?: {
executeFn?: ExecuteFn;
session?: SessionState;
signal?: AbortSignal;
vfs?: Files | null;
statPath?: StatPath | null;
dispatch?: DispatchFn | null;
identity?: Identity | null;
stdin?: ByteSource | null;
/** The start operands, whose rows GNU statted when it opened the
* walk; empty means the working directory. */
readonly starts?: readonly PathSpec[];
}): Promise<[ByteSource | null, Uint8Array, number]>;
//# sourceMappingURL=find_action_dispatch.d.ts.map