@struktoai/mirage-core
Version:
A Unified Virtual Filesystem For AI Agents
134 lines • 6.4 kB
TypeScript
import { FlagView } from '../../../commands/spec/flag_view.ts';
import type { RedirectResult } from '../../../context/session_context.ts';
import { IOResult } from '../../../io/types.ts';
import type { PolicyDenied } from '../../../policy/errors.ts';
import type { DispatchFn } from '../../../runtime/types.ts';
import { PathSpec } from '../../../types.ts';
import type { SessionView } from '../../../view/types.ts';
import type { Namespace } from '../../mount/namespace/namespace.ts';
import type { ParsedCommand } from '../command/types.ts';
/**
* Build the (stream, IOResult, ExecutionNode) triple builtins return.
*
* @param cmd - command name recorded on the ExecutionNode.
* @param init - `out` stdout payload; `exitCode` for both results; `stderr`
* error text encoded onto both; `io` a prebuilt IOResult to reuse (e.g.
* carrying writes), whose exitCode/stderr are overwritten.
*/
export declare function result(cmd: string, init?: {
out?: Uint8Array | null;
exitCode?: number;
stderr?: string;
io?: IOResult;
}): RedirectResult;
export declare function ok(cmd: string, out?: Uint8Array | null): RedirectResult;
export declare function fail(cmd: string, message: string, exitCode?: number): RedirectResult;
/**
* Close an operand loop: exit 1 with joined stderr when any operand failed,
* exit 0 otherwise.
*
* @param cmd - command name.
* @param errors - per-operand error messages collected so far.
* @param io - prebuilt IOResult to reuse (e.g. carrying writes).
*/
export declare function finish(cmd: string, errors: string[], io?: IOResult): RedirectResult;
/**
* Parse a builtin's words with its spec, the way getopt_long does: options
* may follow operands until `--`, long options take their unique
* abbreviations, and a bad one is refused in GNU's words with the `Try`
* line. The operands keep the PathSpecs the classifier made. Mirrors
* Python's parse_line.
*
* @param cmd - the builtin's name.
* @param args - the classified words after the name.
* @param cwd - the session working directory.
*/
export declare function parseLine(cmd: string, args: readonly (string | PathSpec)[], cwd: string): [ParsedCommand, FlagView, RedirectResult | null];
/**
* A path operand as an absolute virtual path.
*
* @param arg - a classified command part.
* @param cwd - session working directory for relative operands.
*/
export declare function absPath(arg: string | PathSpec, cwd: string): string;
export interface SplitValueFlags {
flags: Set<string>;
values: Map<string, string>;
operands: (string | PathSpec)[];
bad: string | null;
}
/**
* Split leading flags where some take a value (`-t STAMP`), strictly: an
* unknown letter is reported instead of tolerated.
*
* @param args - args after the command name.
* @param boolean - single-letter flags with no value.
* @param valued - single-letter flags that consume the next arg.
*/
export declare function splitValueFlags(args: readonly (string | PathSpec)[], boolean: string, valued: string): SplitValueFlags;
/**
* Coerce operands to PathSpec and expand glob patterns per mount, through the
* dispatcher's listings.
*
* A pattern spec only exists for a mounted word (classification gates it), so
* the lookup propagates on a miss; a backend that lists nothing keeps the
* literal spec.
*
* @param namespace - addressing authority (mount lookup).
* @param dispatch - op dispatcher the patterns list through.
* @param operands - positional operands.
*/
export declare function expandOperands(namespace: Namespace, dispatch: DispatchFn, operands: readonly (string | PathSpec)[]): Promise<PathSpec[]>;
/**
* The gated session view this builtin writes through.
*
* Every session write goes through the workspace's gated view, which is
* what makes `preSession` rules enforceable; this used to fall back to
* an ungated view over the same session, so a caller that forgot to
* thread one silently wrote past every policy. A write reached without
* a view is a wiring bug, not a mode, so it throws.
*/
export declare function requireView(state: SessionView | null): SessionView;
/** Render a policy denial in the builtin's own voice. */
export declare function refusal(cmd: string, err: PolicyDenied): RedirectResult;
/**
* The shell's own readonly refusal line, checked before the session view.
* `declare`, `local` and `typeset` name themselves in it (`bash: declare: R:
* readonly variable`); every other writer refuses in the assignment's voice
* (`bash: R: readonly variable`).
*/
export declare function readonlyLine(cmd: string, name: string): string;
/** Render the readonly refusal (`readonlyLine`) as the result. */
export declare function readonlyRefusal(cmd: string, name: string): RedirectResult;
/** A count option's value (`read -n`/`-N`, `mapfile -n`/`-s` and the rest): a run of ASCII digits, else null. */
export declare function countOperand(text: string): number | null;
/** Whether the word is a shell identifier. */
export declare function isValidName(name: string): boolean;
/**
* Whether the word is an optionally signed run of digits, which is what
* `shift`, `return` and `exit` accept as their argument.
*/
export declare function isCountWord(word: string): boolean;
/** A shell builtin's diagnostic in bash's voice. Mirrors Python's builtin_error. */
export declare function builtinError(name: string, message: string): Uint8Array;
/**
* A builtin's usage line, which bash prints after refusing one of its
* options: the synopsis `help NAME` opens with. Mirrors Python's
* builtin_usage.
*/
export declare function builtinUsage(name: string): string;
/**
* The words a numeric builtin reads: a leading `--` ends its options, and
* bash skips it before it reads the number. Mirrors Python's numeric_operands.
*/
export declare function numericOperands(args: readonly string[]): readonly string[];
/** A count word's value modulo 256, the status bash keeps of it. */
export declare function statusOf(word: string): number;
/**
* The byte `read -d` and `mapfile -d` stop at. Bash takes the first byte of
* the argument, not its first character (bash 5.2: `-d é` stops at 0xc3,
* `-d $'\xff'` at the raw byte); an empty argument is NUL and no `-d` is a
* newline. Mirrors Python's record_delimiter.
*/
export declare function recordDelimiter(text: string | null): number;
//# sourceMappingURL=shared.d.ts.map